使用 Node.js 创建 HTTP Web 服务器 Code 例如:

⚡ 智能摘要

Node.js 使用内置的 http 模块,只需几行代码即可构建一个可用的 Web 服务器。该服务器监听指定的端口,并向每个请求返回状态码和响应体,同时,另一段代码会从其他网站获取数据。

  • 🖥️ 服务器创建: http.createServer 注册一个回调函数,该函数会针对每个传入的请求运行一次,并接收请求和响应对象。
  • 🔢 状态和标头: writeHead 在写入任何正文内容之前发送状态码和 Content-Type。
  • ???? 端口绑定: server.listen 将应用程序连接到一个端口,可以选择任何空闲的端口号。
  • 📥 出站请求: 从其他站点获取数据需要 HTTP 客户端,而 Node 现在提供了一个全局 fetch 函数。
  • ⚠️ 已弃用的客户端: 请求模块已于 2020 年 2 月弃用,不应在新代码中使用。
  • 🛠️ 启动失败: EADDRINUSE 错误表示所选端口已被另一个进程占用。

在 Node.js 中创建 HTTP Web 服务器

Node.js 该框架主要用于创建基于服务器的应用程序。它可以轻松构建为用户提供内容的 Web 服务器。

多个模块处理与服务器相关的请求,内置模块 http 其中最重要的模块是Node.js。我们将学习如何使用Node.js创建一个基本的Web服务器应用程序,以及如何从另一个网站请求数据。

使用 HTTP 作为 Web 服务器的 Node

让我们来看一个如何创建和运行第一个Node.js应用程序的例子。

该应用程序创建了一个简单的服务器模块,监听 7000 端口。当浏览器向该端口发出请求时,服务器会发送一个响应。 你好世界 回复客户。

使用 HTTP 作为 Web 服务器的 Node

Code 说明

  1. require 函数读取一个 JavaScript 它加载文件,执行该文件,并返回其导出对象。这里它加载 http 该模块使其功能在应用程序中可用。
  2. 服务器应用程序由一个简单的函数构成。每次有请求到达服务器时,该函数都会运行。
  3. 当收到请求时,会发送状态为“已发送”的响应。 200这是 HTTP 标头中表示成功响应的标准状态码。
  4. 响应体本身就是一个字符串 你好世界.
  5. server.listen 使应用程序监听端口 7000 上的客户端请求。可以使用任何可用的端口。

如果命令运行成功,浏览器中将显示以下输出。

输出

Node Web 服务器输出

输出结果如下:

  • 浏览本地主机 URL 端口 7000 显示字符串 你好世界 在页面中。
  • 因为代码指定了端口 7000,所以只有通过浏览器访问该端口时才能看到输出。

以下是参考代码:

var http = require('http');

var server = http.createServer(function(request, response) {
    response.writeHead(200, { "Content-Type": "text/plain" });
    response.end("Hello World\n");
});

server.listen(7000);

在 Node.js 中处理 GET 请求

在 Node.js 中,使用 GET 请求从另一个站点检索数据非常简单。过去,这需要…… request 通过命令行安装的模块:

npm install request

该命令会指示 Node 包管理器下载并安装所需的模块。安装成功后,命令行会以如下形式显示已安装的模块名称和版本: <name>@<version>.

npm 安装请求输出

在上面的截图中, request 模块及其版本号已下载并安装。

在 Node.js 中发出 GET 请求

Code 说明

  1. request 上一步安装的模块提供了向网站发出 GET 请求所需的功能。
  2. 向网站发出 GET 请求,并在收到响应后执行回调函数。回调函数接收三个参数:
    1. 误差 — 记录发出请求时出现的任何错误。
    2. 响应 — 包含响应返回的 HTTP 标头。
    3. Body — 包含响应的全部内容。
  3. 接收到的内容 body 参数会输出到控制台。

以下是参考代码:

var request = require("request");

request("https://example.com", function(error, response, body) {
    // Always check the error parameter before using the body
    if (error) {
        console.error("Request failed:", error.message);
        return;
    }
    console.log(body);
});

⚠️ 弃用通知: 这个 request 模块是 已于2020年2月完全弃用 并且不再收到任何更新。它仍然可以安装和运行,因此上面的示例对于现有项目仍然有效,但是 npm install request 现在会打印弃用警告。新代码应该使用内置函数。 fetch 函数将在下一节中展示。

如何在Node.js中使用原生fetch发送HTTP请求

Node 包含了一个全局 fetch 自版本 18 起新增此功能,与浏览器已提供的 API 相匹配。无需安装任何软件包,并且该函数返回一个 Promise,因此可以直接使用。 async/await.

// No require and no npm install needed on Node 18 or later

async function getData() {
    try {
        const response = await fetch("https://example.com");

        // fetch does NOT reject on 404 or 500 — check ok yourself
        if (!response.ok) {
            throw new Error("HTTP status " + response.status);
        }

        const body = await response.text();
        console.log(body);

    } catch (err) {
        // Network failures and the throw above both land here
        console.error("Request failed:", err.message);
    }
}

getData();

与回调式编程风格相比,有三点值得注意。首先, fetch 仅在网络级别故障时才会拒绝;HTTP 404 或 500 错误仍然能够成功解析,这就是为什么 response.ok 检查机制的存在以及为什么忽略它是从...迁移时最常见的错误 request其次,身体本身并不包含回应——它必须被明确地解读。 response.text() 纯文本或 response.json() 对于 JSON 来说,每个 JSON 对象都会返回一个 Promise。第三,由于整个调用都是基于 Promise 的,因此单个 Promise 对象只需处理一个 Promise 对象即可。 try/catch 同时涵盖请求和读取的正文,完全取代了错误优先回调参数。

对于必须在 Node 16 或更早版本上运行的脚本,请安装 node-fetch or axios 相反,因为两者都提供了类似的基于 Promise 的接口,并且运行时升级后只需要更改导入行即可。

request、fetch 和 axios:该用哪个?

大多数 Node 文档中都会出现三种 HTTP 客户端,但只有一种适合作为新项目的默认客户端。它们在维护状态、是否需要依赖项以及错误状态指示方式等方面存在差异,因此下表对它们进行了对比。

方面 请求 获取(内置) 爱可信
状态 自 2020 年起已弃用 核心维护 积极维护
安装 npm 包 节点 18+ 上没有 npm 包
样式 错误优先回调 承诺 承诺
JSON解析 手动输入,或使用 JSON 选项 手动通过 response.json() 自动表
404 或 500 错误被拒绝 没有 没有

绝大部分储备使用 fetch 对于基于当前 Node 版本的新项目,由于它不添加任何依赖项,并且与开发者已知的浏览器 API 相匹配,因此请选择。 axios 当自动 JSON 处理、请求拦截器或错误状态拒绝等机制能够节省实际代码时,请保留。 request 仅在已经依赖它并且计划替换它的旧版应用程序中使用。

常见的Node.js服务器错误及其修复方法

首次启动 Node 服务器时,大多数失败都源于端口、路径或缺少响应,而不是服务器代码本身的问题。

  • EADDRINUSE: 另一个进程已经占用了该端口。运行 netstat -ano | findstr :7000 on Windows 或 lsof -i :7000 on macOS 如果是 Linux 系统,则停止该进程或选择其他端口。
  • 低端口上的 EACCES: 低于 1024 的端口需要更高的权限。开发期间请使用高于 1024 的端口,例如 3000 或 7000。
  • 浏览器卡住,始终无法加载: 处理员从未打电话 response.end()连接会一直保持打开状态,直到超时为止,因此通过处理程序的每个路径都必须结束响应。
  • 找不到模块“http”: 文件名拼写错误,或者脚本是在浏览器中而不是在 Node.js 环境中运行的。核心模块无需安装。
  • 更改未显示: Node.js 在启动时加载一次文件。每次编辑后请重启进程,或者使用监视器(例如 .node)运行它。 node --watch server.js.

常见问题

对于单个端点,http 模块就足够了。Express 添加了路由、中间件和请求体解析功能,当应用程序需要处理多个路由时,这些依赖项就显得物有所值了。

需要 https 改用模块,并将密钥和证书传递给 createServer。在生产环境中,反向代理(例如 Nginx)通常会终止 TLS 传输并将纯 HTTP 请求转发到 Node.js。

是的。 AI 工具能够可靠地将错误优先回调转换为 async/await。请检查生成的代码是否添加了 response.ok 检查,因为 fetch 会在返回 404 错误时解析,而这一检查经常被省略。

AI 助手读取错误代码并直接指出原因,区分端口冲突、权限问题或语法错误,从而大大缩短了第一个 Node 项目的猜测时间。

请求对象是一个流,因此需要将其数据事件收集到缓冲区中,并在结束事件发生时解析结果。Express 和类似的框架提供了请求体解析中间件,可以自动执行此步骤。

总结一下这篇文章: