本文简单介绍一下如何使用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/json、application/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/json、text/html、text/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 访问一下服务器

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