源本科技 | 码上会

Node.js 内置模块 http

2026/04/10
1
0

引言

Node.js 内置核心模块 http 专门用于创建 HTTP 服务器和客户端,无需依赖第三方服务器软件,即可快速搭建 Web 服务、处理网络请求与响应。 依托 http 模块,我们可以实现路由处理、动态内容生成、接口开发等功能,它是 Node.js 服务端开发、网络应用构建的基础核心模块。

回顾已知内容

客户端与服务器

网络通信中,两个核心角色分工明确:

  • 客户端:主动发起请求、消费网络资源的设备(如浏览器、手机 APP)

  • 服务器:被动接收请求、对外提供网络资源的设备(如网站服务器、接口服务器)

Node.js 提供的 http 模块,是实现 Web 服务器的核心工具。通过几行代码,就能将普通电脑搭建为支持 HTTP 通信的服务器,替代 IIS、Apache、Nginx 等传统服务器软件。

使用前必须先导入模块:

const http = require('http');

HTTP 模块的核心价值

传统 Web 服务器需要安装专用软件,而 Node.js 的 http 模块:

  1. 轻量高效,基于事件驱动、非阻塞 I/O 模型

  2. 原生支持,无需额外安装依赖

  3. 高度自定义,可灵活处理请求、响应、路由

  4. 适合开发轻量级 Web 服务、API 接口

服务器相关概念

IP 地址

IP 地址是互联网中设备的唯一身份标识,相当于设备的 "电话号码",是网络通信的基础。

  • 格式:点分十进制(a.b.c.d),每一段取值范围为 0 ~ 255

  • 本地测试专用 IP:127.0.0.1(代表当前本机,不联网即可访问)

  • 查看服务器 IP:Windows 终端执行 ping www.baidu.com

域名和域名服务器

IP 地址难以记忆,因此使用域名(字符型地址)作为替代:

  • 域名与 IP 地址一一对应

  • DNS(域名服务器):负责将域名解析为对应的 IP 地址

  • 本地测试域名:localhost,对应 IP 127.0.0.1

端口号

端口号是计算机中网络服务的唯一编号,用于区分同一台设备上的多个 Web 服务。

  • 类比:大楼的房间号,精准定位服务

  • 端口范围:0 ~ 65535

    • 知名端口:1 ~ 1023(系统预留,如 80 端口默认 HTTP 服务)

    • 开发常用:3000、8080、9000(自定义端口,避免冲突)

  • 规则:同一端口同一时间只能被一个服务占用

  • 默认规则:HTTP 的 80 端口可在 URL 中省略

创建服务器

核心创建步骤

创建基础 Web 服务器分为 4 个固定步骤,简单易记:

  1. 导入 http 内置模块

  2. 创建服务器实例对象

  3. 绑定 request 事件,监听并处理客户端请求

  4. 调用 listen 方法,启动服务器并监听指定端口

参考代码

整合拆分的代码,编写可直接运行的完整示例:

// 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.');
});

// 4. 启动服务器,监听 80 端口
server.listen(80, () => {
  console.log('HTTP server running at http://127.0.0.1');
});

运行代码后,浏览器访问 http://127.0.0.1,终端会打印对应日志。

请求对象

req(Request)是请求对象,包含客户端发起请求的所有核心信息:

  • req.url:客户端请求的 URL 路径(如 //about.html

  • req.method:客户端请求的方法类型(如 GETPOST

  • req.headers:完整的请求头信息

示例代码:

server.on('request', (req, res) => {
  // 解构获取核心请求信息
  const { url, method } = req;
  const str = `Your request url is ${url}, and request method is ${method}`;
  console.log(str);
});

响应对象

res(Response)是响应对象,用于向客户端返回数据并结束请求:

  • res.setHeader():单独设置响应头信息

  • res.writeHead():同时设置响应状态码 + 响应头(推荐)

  • res.end()必须调用,向客户端返回内容并结束本次请求

基础响应示例:

server.on('request', (req, res) => {
  const str = `Your request url is ${req.url}, and request method is ${req.method}`;
  // 向客户端响应数据并结束请求
  res.end(str);
});

解决中文乱码

响应中文内容时会出现乱码,必须设置响应头的字符编码

server.on('request', (req, res) => {
  const str = `您请求的 URL 地址是 ${req.url}, 请求的 method 类型是 ${req.method}`;
  
  // 设置响应头,解决中文乱码问题
  res.setHeader('Content-Type', 'text/html; charset=utf-8');
  
  // 响应中文内容
  res.end(str);
});

根据 URL 响应内容

核心实现思路

  1. 获取客户端请求的 URL 地址

  2. 设置默认的 404 响应内容

  3. 根据不同 URL 匹配对应的页面

  4. 统一配置响应头,防止中文乱码

  5. 通过 res.end() 将结果返回客户端

动态路由响应代码

server.on('request', (req, res) => {
  // 获取请求 URL
  const url = req.url;
  // 默认响应 404 页面
  let content = '<h1>404 Not found!</h1>';

  // 路由匹配:根据不同 URL 返回不同内容
  if (url === '/' || url === '/index.html') {
    content = '<h1>首页</h1>';
  } else if (url === '/about.html') {
    content = '<h1>关于我们</h1>';
  }

  // 配置响应头
  res.setHeader('Content-Type', 'text/html; charset=utf-8');
  // 响应最终内容
  res.end(content);
});

HTTP 相关

HTTP 常用请求方法

  • GET:查询 / 获取服务器资源(如访问网页、获取数据)

  • POST:向服务器提交数据(如登录、注册、上传文件)

HTTP 常用响应状态码

  • 200:请求成功,资源正常返回

  • 404:请求的资源不存在

  • 500:服务器内部错误

端口占用解决方案

若运行报错 EADDRINUSE,代表端口被占用:

  1. 更换端口号(推荐 3000、8080、9000)

  2. 关闭占用当前端口的程序

补充说明

模板字符串

模板字符串是 ES 6 新增的语法,使用反引号 ` 包裹字符串,支持直接嵌入变量 / 表达式:

  • 语法:`字符串${变量}字符串`

  • 优势:替代繁琐的字符串拼接,代码更简洁、可读性更高

基础示例:

const name = "John";
const greeting = `Hello, ${name}!`;
console.log(greeting);

http 模块开发中,模板字符串常用于拼接动态响应内容,是服务端开发的必备语法。

开发规范

  1. 本地开发优先使用自定义端口(3000/8080),避免占用系统预留端口

  2. 所有响应中文的接口,必须配置 utf-8 编码

  3. 每次请求处理完成后,必须调用 res.end()

  4. 路由匹配遵循 精确匹配优先 原则


总结

  1. http 是 Node.js 内置模块,无需安装,可快速搭建轻量级 Web 服务器

  2. req 用于获取客户端请求信息,res 用于向客户端返回响应数据

  3. 中文乱码的固定解决方案:设置响应头 Content-Type: text/html; charset=utf-8

  4. 端口号用于区分同一设备的不同网络服务,开发常用 3000、8080 端口

  5. 通过 req.url 可实现基础路由匹配,动态响应不同页面内容