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

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

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

  1. 导入http模块:

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

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

    server.on('request', (req, res) => {
        console.log('Someone visit our web server.');
        /* Request Handle... */
    })
    
  4. 启动服务器。

    server.listen(8080, () => { // 监听 8080 端口
        console.log('Server running at http://127.0.0.1:8080');
        /* Started Handle... */
    })
    

HTTP Demo如下:

// 1. 导入 http 模块
const http = require('http');

// 2. 创建 web 服务器实例
const server = http.createServer()
// 3. 为服务器实例绑定 request 事件,监听客户端请求
server.on('request', (req, res) => {
    /**
     * 设置响应头信息
     * 状态码:200
     * 内容类型: 文本
     */
    res.writeHead(200, {'Content-Type': 'text/plain'})
    // 发送响应数据 "Hello World!"
    res.end('Hello World!\n');
    console.log('Someone visit our web server.');
})

// 4. 启动服务器
server.listen(8080, () => {
    console.log('Server running at http://127.0.0.1:8080');
})

server.on()方法的回调函数的参数列表中,req就是Request(请求)对象,res就是Response(响应)对象。


Request 对象

Request 对象用于获取客户端发送给服务端的请求信息。

获取请求信息(http.createServer()也能注册回调函数,下方演示了使用方式):

const { createServer } = require("http");

createServer((req, res) => {
    console.log('Request URL: ' + req.url);         // 请求URL
    console.log('Request Method: ' + req.method);   // 请求方式
}).listen(8080, () => {
    console.log('Server running at http://127.0.0.1:8080');
})

Response 对象

Request 对象用于服务端响应给客户端数据。

Request 对象响应数据的方式是,调用res.end()方法。就如HTTP Demo中所示。下方展示了另外一个Demo,该Demo展示了Response对象的使用,还展示了http.Server对象的链式调用,并且通过给响应头设置字符集的方式解决中文乱码问题:

const { createServer } = require('http');

var url = 'http://127.0.0.1:8080'

createServer().on('request', (req, res) => {
    // 设置响应数据类型并解决中文乱码
    res.setHeader('Content-Type', 'text/plain; charset=utf-8')
    // 发送响应数据
    res.end(`请求地址: ${url}${req.url}\n请求方式: ${req.method}`);
    // 当调用了 res.end() 之后,就表示响应已经结束了,此时再进行任何响应都是无效的
}).listen(8080, () => {
    console.log('Server running at ' + url);
})

根据 URL 进行响应

使用Node.js的http模块,为文件系统模块中案例2生成的clock页面搭建Web Server:

const http = require('http');
const fs = require('fs');
const path = require('path');

const server = http.createServer();
server.on('request', (req, res) => {
    // res.setHeader('Content-Type', 'text/html; charset=utf-8')
    let url = req.url
    // URL处理
    const DIR_NAME = 'clock'
    if (url == '/') {
        url = path.join(DIR_NAME, 'index.html')
    // 匹配以'/index'开头的URL请求
    } else if (url.startsWith('/index')) {
        url = path.join(DIR_NAME, url)
    }
    // 资源路径拼接
    const PATH = path.join(__dirname, url)
    // 读取文件
    fs.readFile(PATH, 'utf-8', (err, data) => {
        if (err) {
            // 展示错误消息
            res.end(`<h1>404 Error! ${req.url} Not Found!</h1>`)
        }
        // 发送相应数据
        res.end(data)
    })
})

server.listen(8080, () => {
    console.log('Server listen at http://127.0.0.1:8080/');
})