Express 路由详解
在 Express 中,路由用于确定应用程序如何响应客户端对特定端点(URI)的请求,它是构建 Web 应用和 API 的基础。
一、基本概念
路由由一个 URI(路径)、一个 HTTP 请求方法(如 GET、POST 等)和一个或多个处理函数组成。当客户端发送请求时,Express 会根据请求的方法和路径匹配相应的路由,并执行对应的处理函数。
二、路由定义方式
1. 基本路由
const express = require("express");
const app = express();
// 处理 /demo 路径的所有请求
app.all("/demo", (req, res) => {
res.send("all method");
});
// 处理根路径的 GET 请求
app.get("/", (req, res) => {
res.send("Hello, World!");
});
// 处理 /about 路径的 GET 请求
app.get("/about", (req, res) => {
res.send("This is the about page.");
});
const port = 3000;
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
2. 链式路由
创建了一个路由路径 `/books`,并为其定义了 GET、POST 和 PUT 三种请求方法的处理函数。
app
.route("/books")
.get((req, res) => {
res.send("Get a list of books");
})
.post((req, res) => {
res.send("Add a new book");
})
.put((req, res) => {
res.send("Update a book");
});
3. 路由模块
对于大型应用,可将路由逻辑拆分成多个模块,提高代码的可维护性。
// routes/books.js
const express = require("express");
const router = express.Router();
router.get("/", (req, res) => {
res.send("Get a list of books");
});
router.post("/", (req, res) => {
res.send("Add a new book");
});
module.exports = router;
// app.js
const express = require("express");
const app = express();
const booksRouter = require("./routes/books");
app.use("/books", booksRouter);
const port = 3000;
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
三、路由参数
路由参数是在路由路径中定义的动态部分,用于捕获 URL 中的特定值。
app.get("/users/:userId", (req, res) => {
const userId = req.params.userId;
res.send(`User ID: ${userId}`);
});
四、中间件在路由中的应用
中间件可以在路由处理函数之前或之后执行,用于执行一些通用的任务,如身份验证、日志记录等。
1. 应用级中间件在路由中的应用
const logger = (req, res, next) => {
console.log(`Received ${req.method} request for ${req.url}`);
next();
};
app.use(logger);
app.get("/products", (req, res) => {
res.send("List of products");
});
2. 路由级中间件
const authMiddleware = (req, res, next) => {
// 模拟身份验证
const isAuthenticated = true;
if (isAuthenticated) {
next();
} else {
res.status(401).send("Unauthorized");
}
};
app.get("/admin", authMiddleware, (req, res) => {
res.send("Welcome to the admin page");
});
3. 错误处理路由
错误处理路由用于捕获和处理应用程序中的错误,它有四个参数 `(err, req, res, next)`。
app.get("/error", (req, res, next) => {
const err = new Error("Something went wrong");
next(err);
});
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send("Internal Server Error");
});
4. 路由匹配顺序
Express 按照路由定义的顺序依次匹配请求,一旦匹配到一个路由,就会执行对应的处理函数,不再继续匹配后续的路由。因此,路由的定义顺序很重要,特别是对于有重叠路径的路由。
app.get("/users", (req, res) => {
res.send("List of users");
});
app.get("/users/:userId", (req, res) => {
const userId = req.params.userId;
res.send(`User ID: ${userId}`);
});