首先完成“第 1 课:REST 与 HTTP 基础”即可解锁本课程。转到上一课

导言

在开始构建 REST API 之前,你需要一个可以正常工作的项目基础。本课将逐步带你完成所有步骤:初始化 Node.js 项目、安装 Express、编写一个最小化的服务器,并确认它确实可以运行。学完本课后,你将拥有一个能够响应 HTTP 请求的运行中的服务器——这是后续所有课程的基础。

本课程假定你的机器上已经安装了 Node.js(v18 或更高版本)和 npm。继续之前,请运行以下两条命令进行验证:

bash
node --version
npm --version

如果其中任何一条命令报错,请前往 nodejs.org 下载 Node.js(npm 已捆绑在其中)。

初始化项目

为你的项目新建一个目录,并将其初始化为一个 Node.js 包。init 命令会生成一个 package.json 文件,用于追踪项目的元数据和依赖项。

bash
mkdir my-rest-api
cd my-rest-api
npm init -y

-y 标志会接受所有默认值,这样就不会逐个提示你输入项目名称、版本等信息。你可以随时手动编辑 package.json。此时,你的目录中只有这一个文件——还没有任何代码。

接下来,安装 Express:

bash
npm install express

这条命令会将 Express 及其依赖下载到 node_modules 文件夹中,并将该依赖记录在 package.json 的 "dependencies" 字段下。你还会看到一个新生成的 package-lock.json 文件——它用于锁定确切的依赖版本,从而确保团队中每位开发者安装的都是完全一致的依赖包。

流程图,展示 3 个步骤:npm init 创建 package.json;npm install express 将 Express 添加到 node_modules 并更新 package.json 的 dependencies;然后 server.js 引入 Express 来创建应用

构建第一个服务器

在项目根目录下创建一个名为 server.js 的文件。这个文件就是你应用的入口点。

javascript
const express = require('express');
const app = express();
const PORT = 3000;
app.get('/', (req, res) => {
res.json({ message: 'Server is running' });
});
app.listen(PORT, () => {
console.log(`Server listening on http://localhost:${PORT}`);
});

逐步讲解每个部分:require('express') 用于引入这个框架。调用 express() 会创建一个应用实例,并将其存储在 app 中。app.get() 用于注册一个路由处理函数——第一个参数是 URL 路径,第二个参数是一个回调函数,它接收请求对象(req)和响应对象(res)。res.json() 用于发送 JSON 响应,并自动设置 Content-Type 响应头。最后,app.listen() 将服务器绑定到一个端口,并开始接受连接。

启动服务器:

bash
node server.js

你应当可以在控制台看到这条输出消息。打开浏览器访问 http://localhost:3000,或使用 curl:

bash
curl http://localhost:3000

预期输出:

json
{"message": "Server is running"}

优化开发工作流

每次修改代码后都手动重启服务器非常繁琐。将 nodemon 作为开发依赖安装——它会监听你的文件,并在检测到更改时自动重启。

bash
npm install --save-dev nodemon

然后在 package.json 中添加一个 dev 脚本:

json
{
"scripts": {
"start": "node server.js",
"dev": "nodemon server.js"
}
}

现在以开发模式运行服务器:

bash
npm run dev

编辑 server.js 并保存后,nodemon 会自动重启进程,无需你手动操作。start 脚本保留用于生产环境,在生产环境中 nodemon 并不适用。

还有一项改进:解析传入的 JSON 请求体。Express 默认并不会做这件事。请在你的路由之前添加这一行中间件:

javascript
app.use(express.json());

如果不添加,当客户端发送带有 JSON payload 的 POST 请求时,req.body 将是 undefined。现在加上它,可以在后续避免调试时的困惑。

小结

现在你已经拥有一个功能完备的 Express 项目:一个用于追踪依赖的 package.json、已安装的 Express、一个监听 3000 端口的 server.js、一个可正常工作的 GET 路由、用于快速迭代的 nodemon,以及已启用的 JSON 请求体解析。这正是后续课程中讲解每一种 REST API 模式时所使用的起点骨架。下一节课将进入路由部分——随着 API 的增长,定义多个端点并将其组织得清晰有序。