http模块是Node.js官方提供的、用于创建Web服务器的模块。通过http模块提供的http.createServer()方法,就能像Web服务器一样对外提供Web资源服务。
在Node.js中无需使用第三方Web服务器软件,通过http模块就能模拟服务器软件,从而对外提供Web服务。
http模块主要用于搭建HTTP服务端和客户端,使用HTTP服务器或客户端功能必须调用http模块。在Node.js中使用Web服务的基本步骤如下:
-
导入
http模块:1const http = require('http') -
创建Web服务器实例。
1const server = http.createServer() -
为服务器实例绑定
request事件,监听客户端的请求。1server.on('request', (req, res) => { 2 console.log('Someone visit our web server.'); 3 /* Request Handle... */ 4}) -
启动服务器。
1server.listen(8080, () => { // 监听 8080 端口 2 console.log('Server running at http://127.0.0.1:8080'); 3 /* Started Handle... */ 4})
HTTP Demo如下:
1// 1. 导入 http 模块
2const http = require('http');
3
4// 2. 创建 web 服务器实例
5const server = http.createServer()
6// 3. 为服务器实例绑定 request 事件,监听客户端请求
7server.on('request', (req, res) => {
8 /**
9 * 设置响应头信息
10 * 状态码:200
11 * 内容类型: 文本
12 */
13 res.writeHead(200, {'Content-Type': 'text/plain'})
14 // 发送响应数据 "Hello World!"
15 res.end('Hello World!\n');
16 console.log('Someone visit our web server.');
17})
18
19// 4. 启动服务器
20server.listen(8080, () => {
21 console.log('Server running at http://127.0.0.1:8080');
22})
在server.on()方法的回调函数的参数列表中,req就是Request(请求)对象,res就是Response(响应)对象。
Request 对象
Request 对象用于获取客户端发送给服务端的请求信息。
获取请求信息(http.createServer()也能注册回调函数,下方演示了使用方式):
1const { createServer } = require("http");
2
3createServer((req, res) => {
4 console.log('Request URL: ' + req.url); // 请求URL
5 console.log('Request Method: ' + req.method); // 请求方式
6}).listen(8080, () => {
7 console.log('Server running at http://127.0.0.1:8080');
8})
Response 对象
Request 对象用于服务端响应给客户端数据。
Request 对象响应数据的方式是,调用res.end()方法。就如HTTP Demo中所示。下方展示了另外一个Demo,该Demo展示了Response对象的使用,还展示了http.Server对象的链式调用,并且通过给响应头设置字符集的方式解决中文乱码问题:
1const { createServer } = require('http');
2
3var url = 'http://127.0.0.1:8080'
4
5createServer().on('request', (req, res) => {
6 // 设置响应数据类型并解决中文乱码
7 res.setHeader('Content-Type', 'text/plain; charset=utf-8')
8 // 发送响应数据
9 res.end(`请求地址: ${url}${req.url}\n请求方式: ${req.method}`);
10 // 当调用了 res.end() 之后,就表示响应已经结束了,此时再进行任何响应都是无效的
11}).listen(8080, () => {
12 console.log('Server running at ' + url);
13})
根据 URL 进行响应
使用Node.js的http模块,为文件系统模块中案例2生成的clock页面搭建Web Server:
1const http = require('http');
2const fs = require('fs');
3const path = require('path');
4
5const server = http.createServer();
6server.on('request', (req, res) => {
7 // res.setHeader('Content-Type', 'text/html; charset=utf-8')
8 let url = req.url
9 // URL处理
10 const DIR_NAME = 'clock'
11 if (url == '/') {
12 url = path.join(DIR_NAME, 'index.html')
13 // 匹配以'/index'开头的URL请求
14 } else if (url.startsWith('/index')) {
15 url = path.join(DIR_NAME, url)
16 }
17 // 资源路径拼接
18 const PATH = path.join(__dirname, url)
19 // 读取文件
20 fs.readFile(PATH, 'utf-8', (err, data) => {
21 if (err) {
22 // 展示错误消息
23 res.end(`<h1>404 Error! ${req.url} Not Found!</h1>`)
24 }
25 // 发送相应数据
26 res.end(data)
27 })
28})
29
30server.listen(8080, () => {
31 console.log('Server listen at http://127.0.0.1:8080/');
32})
评论