Express 编写中间件
概述
中间件在 Express 中是非常重要的概念。简单来说,它们就是具有访问请求对象(req)、响应对象(res)和下一个函数(通常表示为next)权限的函数。中间件可以执行各种任务,比如执行代码、修改请求和响应对象,或者结束请求-响应循环。
在 Express 中,当收到请求时,它会按照定义的顺序依次调用中间件。每个中间件都可以决定是否继续传递请求给下一个中间件,如果要继续,就调用next()函数,否则请求处理过程将在当前中间件结束。如果没有中间件结束请求-响应循环,Express 就会一直等待,直到服务器关闭或者发送响应为止。
中间件函数的元素
一个中间件函数通常由以下几个元素组成:
异步中间件
从Express 5开始,中间件函数可以返回Promise。当Promise被拒绝或函数抛出错误时,Express会自动调用next(value)
,其中value
是拒绝的原因或抛出的错误。这使得异步操作的处理更加简洁和直观。
示例
下面是一个简单的Express应用程序示例,其中包含了几个中间件函数:
const express = require('express');
const app = express();
// myLogger中间件,记录请求日志
const myLogger = (req, res, next) => {
console.log('LOGGED:', req.method, req.url);
next();
};
// requestTime中间件,记录请求时间戳
const requestTime = (req, res, next) => {
req.requestTime = Date.now();
next();
};
// validateCookies中间件,验证cookie的有效性
const validateCookies = (req, res, next) => {
const userToken = req.cookies.userToken;
if (!userToken || userToken !== 'valid_token') {
return res.status(401).send('Unauthorized: Invalid or missing user token');
}
next();
};
// 应用中间件
app.use(myLogger);
app.use(requestTime);
app.use(validateCookies);
// 根路由处理函数
app.get('/', (req, res) => {
const responseText = `Hello World! Requested at: ${new Date(req.requestTime).toISOString()}`;
res.send(responseText);
});
// 监听端口
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
在这个示例中,我们定义了三个中间件函数:myLogger
、requestTime
和validateCookies
,并将它们应用到了整个应用程序上。然后,我们定义了一个根路由处理函数,并在其中使用了由requestTime
中间件添加到请求对象上的requestTime
属性。