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}`);

});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yqcoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值