本文简单介绍一下如何使用node.js构建一个简单的web服务器。

构建web服务器的基本步骤如下:

(1)引入http模块

(2)创建Web服务器实例

(3)启动监听服务器

(4)为Web服务器实例绑定request事件

(5)根据客户端请求进行响应

1.http模块简介

在Node.js中,http模块是内置的核心模块之一,使用该模块可以轻松搭建Web服务器和客户端,实现Web应用的请求与响应。在实际应用中,http模块一般用来构建服务器。

http 模块的核心是处理客户端请求和服务端响应的全生命周期。

(1)请求方式

Node.js http 模块支持所有标准 HTTP 请求方法,通过 req.method 获取,常用的有

方法用途示例
GET获取资源(无请求体)查询数据、页面访问
POST提交资源(带请求体)提交表单、创建数据
PUT全量更新资源更新用户全部信息
DELETE删除资源删除一条数据

(2) 请求头(Request Headers)

客户端传递的附加信息(如数据格式、客户端类型),通过 req.headers 获取,常用头信息:

  • Content-Type:请求体的数据格式(如 application/jsonapplication/x-www-form-urlencoded);
  • User-Agent:客户端标识(浏览器 、 Postman 、 移动端);
  • Authorization:身份验证(如 Token)。

(3) 请求体(Request Body)

POST、PUT 等方法携带的业务数据(GET 无请求体),需通过流事件拼接获取(http 模块原生需手动处理)。

(4)响应状态码(Status Code)

通过 res.writeHead(状态码) 设置,核心状态码分类:

状态码区间含义常用示例
2xx成功200(请求成功)
4xx客户端错误400(参数错误)、404(路径不存在)
5xx服务端错误500(服务器内部错误)

(5)响应头(Response Headers)

告诉客户端响应数据的格式、编码等信息,常用:

  • Content-Type:响应体格式(如 application/jsontext/htmltext/plain);
  • Access-Control-Allow-Origin:跨域允许的源(解决前端跨域);
  • Set-Cookie:设置客户端 Cookie。

(6)响应体(Response Body)

服务端返回的实际业务数据,通过 res.end(内容) 发送,支持字符串、Buffer 等格式(JSON 需手动序列化)。


2.创建项目

我们使用vscode创建项目,在控制台中输入

mkdir web
cd web

这样创建一个名字为web的文件夹。

然后用vscode打开这个文件夹。然后点击“终端”,点击“新建终端”

然后在控制台中输入

npm init -y

初始化这个项目。package.json这个文件里面创建完代码如下:

{
  "name": "web",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "type": "commonjs"
}

(1)创建文件index.js

点击创建文件。

文件名为index.js

(2)引入http并创建Web服务器

http模块只需要引入即可,语法很简单

var http = require('http');

使用http模块的createServer()方法可以创建Web服务器,返回http.Server对象实例,语法为

http.createServer();

可以给Web服务器示例命名,这里暂时命名为Server

var server = http.createServer();

(3)启动监听服务器

在创建了Web服务器实例Server后,使其listen()方法启动该Web服务器,语法为:

server.listen([port[,host[,backlog]]][,callback])

参数说明:

port:端口号

host:主机名

backlog:server.listen()方法的通用参数

callback:Web服务器启动后的回调函数

一个例子为:

server.listen(3000, function() {
    console.log('Server is listening on port 3000');
});

(4)为Web服务器绑定request事件

使用http模块创建的Server实例是一个基于事件的Web服务器,有一个request事件监听器,来自客户端的http请求会被自动添加到request事件中。构建服务器的目的是对外提供资源服务,服务器构建后,就要为服务器绑定request事件,用来监听客户端发来的请求,一旦有请求发送过来,就会触发request事件,服务器根据代码做出响应。绑定request事件的代码如下:

server.on('request', function(request, response) { //事件驱动编程
 //这里是分析请求,进行响应。  
});

上述代码中的server.on()事件监听函数有两个参数,第一个参数“request”是事件名,表示只有要服务器接收到客户端的请求,这段代码就会被执行;第二个参数是一个回调函数,含request和reponse两个对象参数。

request对象封装了请求报文的相关内容,通过分析request对象可以知道客户端发送的具体请求信息,包括请求方式、URL、请求头等,response对象封装了服务器响应报文的相关内容,比如响应的字符串、响应的数据对象等。

注意:request和response的写法不是固定的,有时也会简写为req和res,比如下面这样:

server.on('request', function(req, res) { //事件驱动编程
 //这里是分析请求,进行响应。  
});

(5)编写response进行响应

在服务器的监听函数内部,通过回调函数的response对象响应处理客户端的请求,可以完成发送响应头、发送响应正文、结束响应等操作。

response对象常用的方法如下:

5.1 response.writeHead()方法

该方法用于向请求发送响应头,语法为

response.writeHead(STATUS_CODES[,statusMessage][, headers]);

参数说明如下:

STATUS_CODES:一个三位数的HTTP状态码,比如200、404

statusMessage:可选,用户可读的statusMessage

headers:要发送的响应头

5.2 response.setHead()方法

这个方法用于设置单个响应头的只,语法为

response.setHeader(name, value);

参数说明如下:

name:响应头字段名称

value:响应头字段的值

如果设置的字段已经存在于待发送的响应头中,则其值将被替换

5.3 response.write()方法

该方法用于发送响应正文,可以多次调用该方法以提供连续响应,语法为:

response.write(chunk[, encoding][, callback]);

参数说明如下:

chunk:响应主体的数据,为字符串或Buffer

encoding:字符编码,默认值为“utf-8”

callback:回调函数

第一次调用response.write()方法时,它会将缓存的响应头信息和正文的第一个块发送给客户端。

第二次调用response.write()方法时,Node.js会假定数据将被流式传输,并单独发送新数据。也就是说,响应正被缓冲到正文的第一个块。

5.4 response.end()方法

该方法用于向服务器发送信号,表明所有响应头和正文都已发送,该服务器应认为此消息已完成。结束请求必须用到end()方法,而且这个方法有且只有一次,语法为:

response.end(data[, encoding][, callback]); 

参数说明:

data:响应主体信息,为字符串或Buffer缓存区,可选。

encoding:字符编码,默认值为“utf-8”

callback:回调函数

3.Web构建的实例

修改index.js文件如下:

var http = require('http');

var server = http.createServer(); //创建服务器对象

server.on('request', function(request, response) { //事件驱动编程
    response.setHeader('Content-Type', 'text/plain; charset=utf-8'); //设置响应头
    response.writeHead(200, 'OK'); //设置响应状态码和状态消息
    response.write('Hello World\n');//写响应体
    response.end(); //结束响应
});

//启动服务器,监听3000端口
server.listen(4000, function() {
    console.log('Server is listening on port 4000');
});


在控制台中输入node indes.js,开始运行程序

可以看到下图,服务端已经正常开启了。

我们打开浏览器,在浏览器中输入localhost:4000 访问一下服务器

从上图可以看到,正常访问。返回值也正常。