当前位置: 首页 > article >正文

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

});


http://www.kler.cn/a/549240.html

相关文章:

  • 人工智能之目标追踪DeepSort源码解读(yolov5目标检测,代价矩阵,余弦相似度,马氏距离,匹配与预测更新)
  • 代码随想录算法【Day47】
  • Kimi k1.5:继Deepseek R1 后多模态 AI 的新标杆
  • 构建 LVS-DR 群集
  • gitlab Webhook 配置jenkins时“触发远程构建 (例如,使用脚本)”报错
  • 单位切换且后换算得方法
  • 前端知识速记:BFC与IFC
  • C/C++程序的内存是如何开辟的?
  • 【C++笔记】C++11的深度剖析(一)
  • 深入解析DNS:从域名到IP的寻址之旅
  • 深兰科技与银川市苏银产业园签署协议,共建AI装备西部产业基地
  • freertos源码分析DAY12 (软件定时器)
  • osgearth控件显示中文(八)
  • Audio-Visual Speech Enhancement(视听语音增强)领域近三年研究进展与国内团队及手机厂商动态分析
  • 【函数题】6-10 二分查找
  • 【LeetCode】438.找到字符串中所有的字母异位词
  • 请解释设备像素、CSS 像素、设备独立像素、DPR、PPI 之间的区别?
  • 详解如何使用Pytest内置Fixture tmp_path 管理临时文件
  • Redis之持久化
  • VUE3环境搭建