Node.js核心模块——http模块,用以创建Web服务器,从而对外提供Web资源服务。本章简明扼要地阐述使用http模块内置http.createServer()方法实例化http.Server类,并创建请求、响应对象,搭建简单的Web服务器。完整API参照官方文档:http 超文本传输协议 | Node.js API 文档
一、导入http模块
我们通过以下方式来引入该模块:
const http = require('http');
通过http模块内置方法:http.createServer(),创建一个新的服务器时,将会实例化http.Server类,从而创建一个服务器对象
// 导入http模块
const http = require('http');
// 创建Web服务器对象
const server = http.createServer();
如上:当要有了服务器对象server后,便可以访问其方法:listen()与close()
服务器对象通过.listen(端口号, 回调)方法启动HTTP服务器:
// 导入http模块
const http = require('http');
// 创建Web服务器对象
const server = http.createServer();
// 监听端口号5005并启动HTTP服务器
server.listen(5005, () => {
console.log('Web服务器启动成功啦!')
})
终端输入node指令启动服务器:
同理,服务器对象通过调用.close([callback])方法,停止服务器并不再接受新的连接
当创建完服务器对象并可以通过listen()设置端口启动服务器后,我们需要监听客户端发来的请求,并且还需要向客户端做出响应,我们可以使用node.js事件触发器.on()方法为服务器对象绑定request事件,当客户端访问服务器时,触发事件处理函数:
// 服务器实例通过.on()方法为服务器绑定request事件,监听客户端发来的请求,触发事件处理函数
server.on('request', (req, res) => {
console.log('Web服务器被访问啦!')
})
我们通过浏览器输入本地服务器地址检验:
当服务器实例监听request事件时,将会创建类http.IncomingMessage的实例对象,通常叫做请求对象req,作为事件处理函数的第一个参数,用来访问与客户端请求相关的数据和属性,如:
- 使用
statusCode
和statusMessage
方法来访问状态。- 使用
headers
方法或rawHeaders
来访问消息头。- 使用
method
方法来访问 HTTP 方法。- 使用
httpVersion
方法来访问 HTTP 版本。- 使用
url
方法来访问 URL。- 使用
socket
方法来访问底层的 socket。
例如:
// 导入http模块
const http = require('http');
// 创建Web服务器实例
const server = http.createServer();
// 服务器实例通过.on()方法为服务器绑定request事件,监听客户端发来的请求,触发事件处理函数
server.on('request', (req, res) => {
// req.httpVersion访问http版本
const version = req.httpVersion;
// req.url访问客户端请求的 URL 地址
const url = req.url;
// req.method访问客户端请求的 method 类型
const method = req.method;
const str = `Your request url is ${url}, request method is ${method} and httpVersion is ${version}`;
console.log(str);
})
// 服务器实例通过.listen(端口号, 回调)方法启动Web服务器
server.listen(5005, () => {
console.log('Web服务器启动成功啦!')
})
启动服务器并访问url为post的地址:
同理,http.ServerResponse类也会创建实例对象,通常称作响应对象res,作为事件处理函数的第二个参数,在事件处理函数中,响应对象res通过调用end()方法用于将服务器的数据或属性响应给客户端,如:
// 服务器实例通过.on()方法为服务器绑定request事件,监听客户端发来的请求,触发事件处理函数
server.on('request', (req, res) => {
const version = req.httpVersion;
const url = req.url;
const method = req.method;
const str = `Your request url is ${url}, request method is ${method} and httpVersion is ${version}`;
// 调用res.end()方法向客户端响应一些内容
res.end(str);
})
启动并访问服务器即可收到响应数据字符串:
同时,该对象提供一些方法与HTTP消息头进行交互,如我们可以通过res.setHeader('Content-Type', 'text/html; charset=utf-8'),规定编码格式,解决响应中文乱码。
const testChinese = '测试中文乱码!'; // 若不设置响应头将会乱码
// 设置响应头,解决中文乱码
res.setHeader('Content-Type', 'text/html; charset=utf-8');
// 调用res.end()方法向客户端返回中文字符串
res.end(testChinese);