Express 中间件是什么

在 Express 里,中间件是具备访问请求对象(`req`)、响应对象(`res`)以及应用程序请求-响应循环中的下一个中间件函数(一般用`next`表示)的函数。

一、中间件的定义与调用顺序

在 Express 应用中,中间件按照它们被定义的顺序依次执行。若一个中间件调用了 `next()` 函数,请求就会传递给下一个中间件;若没有调用 `next()`,请求处理流程会在此处停止。

javascript 复制代码
const middleware = (req, res, next) => {

  // 在这里可以执行一些操作,如日志记录、身份验证等

  next(); // 调用 next() 函数将控制权传递给下一个中间件或路由处理函数

};

二、中间件的作用

请求预处理:中间件可在请求到达路由处理函数之前对请求进行处理,例如解析请求体、验证请求参数、记录请求日志等。

响应处理:可在响应发送给客户端之前对响应进行处理,例如设置响应头、格式化响应数据等。

错误处理:专门的错误处理中间件能够捕获和处理应用程序中的错误,避免程序崩溃,并向客户端返回合适的错误信息。

身份验证与授权:用于验证用户身份和权限,确保只有经过授权的用户才能访问特定的路由或资源。

三、中间件的使用方式

1. 应用级中间件

通过 `app.use()` 或 `app.METHOD()`(如 `app.get()`、`app.post()` 等)将中间件应用到整个应用或特定的路由上。

javascript 复制代码
const express = require("express");

const app = express();

// 应用级中间件,对所有请求生效

app.use((req, res, next) => {

  console.log("This is an application-level middleware");

  next();

});

// 应用到特定路由的中间件

app.get(

  "/",

  (req, res, next) => {

    console.log("This middleware is applied to the root route");

    next();

  },

  (req, res) => {

    res.send("Hello, World!");

  }

);

app.listen(3000, () => {

  console.log("Server is running on port 3000");

});

2. 路由级中间件

与应用级中间件类似,但它是通过路由实例来使用的。

javascript 复制代码
const express = require("express");

const app = express();

const router = express.Router();

// 路由级中间件

router.use((req, res, next) => {

  console.log("This is a router-level middleware");

  next();

});

router.get("/", (req, res) => {

  res.send("Hello from the router!");

});

app.use("/router", router);

app.listen(3000, () => {

  console.log("Server is running on port 3000");

});

3. 错误处理中间件

错误处理中间件有四个参数 `(err, req, res, next)`,用于捕获和处理应用程序中的错误。

javascript 复制代码
const express = require("express");

const app = express();

app.get("/", (req, res) => {

  throw new Error("Something went wrong!");

});

// 错误处理中间件

app.use((err, req, res, next) => {

  console.error(err);

  res.status(500).send("Internal Server Error");

});

app.listen(3000, () => {

  console.log("Server is running on port 3000");

});

4. 第三方中间件

可以使用第三方中间件来增强 Express 应用的功能,例如 `body-parser` 用于解析请求体,`morgan` 用于记录请求日志。

javascript 复制代码
const express = require("express");

const app = express();

const bodyParser = require("body-parser");

const morgan = require("morgan");



// 使用 morgan 中间件记录请求日志

app.use(morgan("dev"));

// 使用 body-parser 中间件解析请求体

app.use(bodyParser.json());

app.post("/data", (req, res) => {

  console.log(req.body);

  res.send("Data received");

});

app.listen(3000, () => {

  console.log("Server is running on port 3000");

});
相关推荐
qq_283720053 小时前
LangChain 动态模型中间件实战使用技巧
中间件·langchain·middleware·wrap_model_call
Json____5 小时前
node-电商商城平台实战项目(管理端+用户端)
node·vue2·express·element-ui·电商商城
晚风_END16 小时前
Linux|操作系统|最新版openzfs编译记录
linux·运维·服务器·数据库·spring·中间件·个人开发
星光开发者1 天前
基于springboot电动汽车租赁管理系统-计算机毕设 附源码 11217
javascript·spring boot·mysql·django·php·html5·express
运维全栈笔记3 天前
Linux安装配置Tomcat保姆级教程:从部署到性能调优
linux·服务器·中间件·tomcat·apache·web
许长安3 天前
protobuf 使用详解
c++·经验分享·笔记·中间件
jeCA EURG4 天前
docker离线安装及部署各类中间件(x86系统架构)
docker·中间件·系统架构
一袋米扛几楼986 天前
【报错问题】解决 Vercel 部署报错:Express 类型失效与 TypeScript 2349/2339/2769 错误排查
ubuntu·typescript·express
许彰午6 天前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务
亿牛云爬虫专家7 天前
Go爬虫进阶:如何优雅地在Colly框架中实现无缝代理切换?
爬虫·中间件·golang·爬虫代理·colly框架·代理切换·api提取