Skip to content

ExpressJS - 路由

路由(Routing)是指应用程序如何响应客户端对特定端点(endpoint)的请求,该端点由一个 URI(或路径)和一个特定的 HTTP 请求方法(例如 GET、POST 等)组成。

Express 中路由的基本结构是:

app.METHOD(PATH, HANDLER)
  • app 是一个 Express 实例。
  • METHOD 是小写的 HTTP 请求方法(例如 get、post)。
  • PATH 是服务器上的路径。
  • HANDLER 是当路由匹配时执行的函数。
import express from 'express';
const app = express();
// 响应根 URL 的 GET 请求
app.get('/', (req, res) => {
res.send('Welcome to the homepage!');
});
// 响应 '/api/users' 的 POST 请求
app.post('/api/users', (req, res) => {
res.send('New user created!');
});
app.listen(3000);

路由参数(Route parameters)是 URL 中用于捕获特定位置值的命名片段。捕获到的值会填充到 req.params 对象中。

// 路由路径:/users/:userId/books/:bookId
// 请求 URL:http://localhost:3000/users/101/books/42
// req.params 将是:{ "userId": "101", "bookId": "42" }
app.get('/users/:userId/books/:bookId', (req, res) => {
const { userId, bookId } = req.params;
res.send(`Fetching book with ID ${bookId} for user with ID ${userId}.`);
});

随着应用程序的增长,将所有路由定义在一个文件中会变得难以管理。express.Router 是一个迷你 Express 应用程序,它允许您对路由处理器(route handlers)和中间件(middleware)进行分组,从而使您的代码保持模块化和有组织。

一种常见做法是将路由分离到 routes 目录下的独立文件中。

my-app/
├── src/
│ ├── routes/
│ │ ├── users.routes.js
│ │ └── products.routes.js
│ └── app.js # Main app file
└── package.json

首先,在 src/routes/users.routes.js 文件中定义用户相关的路由。

src/routes/users.routes.js
import express from 'express';
const router = express.Router();
// 注意:这里的路径是相对于 app.js 中定义的路径
// GET /api/users/
router.get('/', (req, res) => {
res.json({ message: 'List of all users' });
});
// POST /api/users/
router.post('/', (req, res) => {
res.status(201).json({ message: 'User created' });
});
// GET /api/users/:id
router.get('/:id', (req, res) => {
res.json({ message: `Details for user ${req.params.id}` });
});
// 重要:导出路由
export default router;

接下来,在主应用程序文件 src/app.js 中导入并 use 这个路由。

src/app.js
import express from 'express';
import usersRouter from './routes/users.routes.js';
// import productsRouter from './routes/products.routes.js'; // 你可以在这里添加其他路由
const app = express();
const PORT = 3000;
app.use(express.json()); // 用于解析 JSON 的中间件
// 挂载路由
// usersRouter 中的所有路由都将以 '/api/users' 为前缀
app.use('/api/users', usersRouter);
// app.use('/api/products', productsRouter);
app.get('/', (req, res) => {
res.send('API is running...');
});
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
  • 模块化: 将相关路由保持在一起,使代码更易于理解和查找。
  • 可维护性: 对用户相关端点的更改只需修改 users.routes.js 文件。
  • 可重用性: 您可以将中间件专门应用于一个路由,然后它将应用于该路由中定义的所有路由。

通过使用 express.Router,您可以为 Express 应用程序创建一个清晰、可扩展且专业的结构,这对于任何超越简单演示的项目都至关重要。