L.Leverage Learn从第一行代码,到读懂真实后端查看项目源码

后端入门与项目导览 / 第 9 课

用 Express.js 写出第一个后端

从一个问候接口开始,亲手连接路由、请求正文、输入检查与 JSON 响应。

◷ 预计 25 分钟 · 面向初学者

上一课知道了请求和响应,这一课把它们写出来。Express.js 是一个运行在 Node.js 上的轻量 Web 框架:它帮我们匹配请求路径、读取输入、发送响应。先做一个与具体项目无关的问候接口,不需要数据库、账号或装饰器。

1. 准备并运行

先安装 Node.js(推荐 Node 22 LTS 或更新版本)。Node 附带的 npm 是包管理工具,用来安装别人发布的代码包。打开终端,执行下面的命令建立一个新项目:

mkdir hello-backend
cd hello-backend
npm init -y
npm install express@5

前两条创建文件夹并进入它,npm init 创建记录项目信息的 package.json,npm install 安装 Express 5。新建 server.mjs,复制下面的完整代码;也可以打开示例文件并保存。.mjs 表示文件使用 JavaScript 模块语法,首行 import 从安装的 Express 包取得代码。

import express from 'express';

const app = express();
app.use(express.json());

app.get('/hello', function (req, res) {
  res.json({ message: '你好!' });
});

app.post('/greetings', function (req, res) {
  if (req.body === undefined) {
    return res.status(400).json({ error: '请发送 JSON 正文' });
  }
  const name = req.body.name;
  if (typeof name !== 'string' || name.trim() === '') {
    return res.status(400).json({ error: 'name 必须是非空字符串' });
  }
  res.json({ message: '你好,' + name.trim() + '!' });
});

app.listen(3000, '127.0.0.1', function () {
  console.log('打开 http://127.0.0.1:3000/hello');
});

执行 node server.mjs,保持这个终端运行。浏览器打开 http://127.0.0.1:3000/hello,会看到 {"message":"你好!"}。127.0.0.1 指向自己的电脑,3000 是这个程序监听的端口;按 Ctrl+C 可停止服务。

教程站仍是静态页面,下面的选择练习不会启动 Node.js。真正的 Express 服务需要按这些步骤在本机运行。

2. 路由怎样连接请求与函数

express() 创建应用对象。app.get('/hello', ...) 注册一个路由:当 GET 方法和 /hello 路径都匹配时,Express 调用后面的函数。参数 req 是请求,res 是响应;名字是约定,重要的是它们的位置。res.json(...) 将对象转成 JSON 并发送,默认状态码是 200。

app.listen(...) 才开始接收网络请求。程序定义路由后会持续等待,每次有人请求,才调用相应函数;它不是从头到尾执行一遍就结束的小脚本。

3. 读取正文,再检查输入

app.use(express.json()) 安装 JSON 解析中间件。中间件是请求经过的一步处理;这里把 JSON 正文解析成 req.body,因此要写在需要正文的路由前。解析成功只说明能读成数据,不说明字段正确。

POST 路由检查 name。!== 表示不相等,|| 表示“两个条件有一个成立”,trim() 去掉字符串两端空白。输入缺失、不是字符串或只有空白时,返回 400;这里的 return 也让函数立即结束,避免后面再发送一次响应。通过后才生成问候。没有匹配路由时,Express 默认返回 404。

可以用系统终端的 curl 发一个带 JSON 正文的请求:

curl -i http://127.0.0.1:3000/greetings \
  -H 'Content-Type: application/json' \
  -d '{"name":"小林"}'

-d 提供正文,curl 因此使用 POST;-H 声明正文是 JSON,-i 显示响应状态和标头。有效请求返回 200 与 {"message":"你好,小林!"}。把正文改成 {"name":18},再观察 400 与错误信息。

自己改一处

新增 GET /time,返回对象 { "message": "现在可以休息了" }。它需要 JSON 解析中间件吗?

**答案:**用 app.get('/time', function (req, res) { res.json({ message: '现在可以休息了' }); });,写在 app.listen 前。这个 GET 路由没有读取请求正文,不依赖 express.json()。

你已经亲手走过“匹配路由 → 读取并检查输入 → 处理 → 发送响应”。最后一课再看 NestJS 怎样组织相同的工作,以及 OJ 为什么还需要数据库和评测队列。

互动练习:Express 怎样处理输入

POST 路由需要从 req.body 读取 JSON 字段。哪一步应先注册在路由前?

选择一个答案

✓
这一课,你已经能……

Express 路由把 HTTP 请求交给处理函数,处理中读取并检查输入,再返回带状态码的响应。