http模块是Node.js官方提供的、用于创建Web服务器的模块。通过http模块提供的http.createServer()方法,就能像Web服务器一样对外提供Web资源服务。

在Node.js中无需使用第三方Web服务器软件,通过http模块就能模拟服务器软件,从而对外提供Web服务。

http模块主要用于搭建HTTP服务端和客户端,使用HTTP服务器或客户端功能必须调用http模块。在Node.js中使用Web服务的基本步骤如下:

  1. 导入http模块:

    1const http = require('http')
    
  2. 创建Web服务器实例。

    1const server = http.createServer()
    
  3. 为服务器实例绑定request事件,监听客户端的请求。

    1server.on('request', (req, res) => {
    2    console.log('Someone visit our web server.');
    3    /* Request Handle... */
    4})
    
  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})