📜  Express.js 中的中间件是什么?(1)

📅  最后修改于: 2023-12-03 14:41:05.148000             🧑  作者: Mango

Express.js 中的中间件是什么?

在 Express.js 中,中间件是一个函数,它可以访问请求对象(request object - req),响应对象(response object - res),和 next 函数的三个参数。中间件函数可以执行任何操作,可以修改请求和响应对象,可以结束请求-响应循环,也可以调用 next 函数将控制传递给下一个中间件函数。一个 Express.js 应用程序可以由多个中间件函数组成,每个中间件函数都有自己的任务,可以是路由处理程序、错误处理程序等。

编写中间件函数

编写 Express.js 中间件函数需要遵循一些规则:

  • 中间件函数必须是一个函数,且可以包含多个参数,其中第一个参数为请求对象(req),第二个参数为响应对象(res),第三个参数为 next 函数,表示将控制传递给下一个中间件。如果中间件不会使用 req、res 或 next,则可以省略参数。
  • 中间件函数必须使用 next 函数将控制传递给下一个中间件。如果当前中间件处理请求,并且不调用 next 函数,则请求-响应循环会停止在这里。
  • 中间件函数可以修改请求对象和响应对象,但必须在调用 next 函数之前完成修改操作。
  • 如果中间件函数代码出现了错误,则应该使用 next 函数将控制传递给错误处理程序。

下面是一个简单的中间件函数的示例:

// middleware function
const myMiddleware = (req, res, next) => {
  console.log('This is my middleware.');
  next();
};

// use middleware
app.use(myMiddleware);

此中间件函数仅向控制台输出一条消息,然后使用 next 函数将控制权传递给下一个中间件函数。

使用中间件

在 Express.js 中,使用 app.use() 函数将中间件函数添加到 Express.js 应用程序中。可以将中间件函数添加到整个应用程序(全局中间件),也可以将其添加到特定的路由上(路由中间件)。下面是一个添加全局中间件的示例:

// middleware function
const logger = (req, res, next) => {
  console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
  next();
};

// use middleware
app.use(logger);

此中间件函数将每个请求的时间戳、请求方法和请求 URL 输出到控制台。

路由中间件

除了全局中间件外,还可以将中间件函数添加到特定的路由上。当请求的 URL 路径与路由的路径匹配时,路由中间件将被调用。下面是如何在路由上添加中间件的示例:

// middleware function
const auth = (req, res, next) => {
  if (req.headers.authorization === 'secret') {
    next();
  } else {
    res.sendStatus(401);
  }
};

// route with middleware
app.get('/protected', auth, (req, res) => {
  res.send('You are authorized.');
});

此中间件函数将检查请求头中的 authorization 字段是否为 'secret',如果是,则将控制传递给下一个中间件,否则将发送一个状态为 401 的 HTTP 响应。

错误处理中间件

错误处理中间件函数与常规中间件函数类似,其不同之处在于其应对程序运行中可能发生的错误:在请求处理期间抛出的任何错误都会由错误处理中间件捕获。错误处理中间件必须使用四个参数:错误对象、请求对象、响应对象和 next 函数。下面是错误处理中间件函数的示例:

// error handling middleware
const errorHandler = (err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Something went wrong!');
};

// use error handling middleware
app.use(errorHandler);

此中间件函数被添加到应用程序中,并用于处理程序中发生的任何错误。当错误发生时,它将控制传递给错误处理中间件,该中间件将错误堆栈输出到控制台,并发送一个 HTTP 状态为 500 的响应。

总结

Express.js 中的中间件是一种函数,它可以访问请求和响应对象并控制流程。中间件可以用于处理请求、验证和授权等操作。它们可以添加到整个应用程序或特定的路由上,并且可以按特定顺序进行排序。对于新手程序员来说,编写有效的中间件函数是创建可维护和可扩展 Express.js 应用程序的关键。