在我的 Node.js Express 应用程序中,我使用
multer
等中间件来处理文件上传,使用 cookieParser()
来管理 cookie。这些中间件函数通常会向请求和响应对象添加属性,例如 multer 的 req.file
或 cookieParser 的 req.cookies
。我的问题是,这些属性在请求和响应对象中保留多长时间?如果我向中间件函数中的请求或响应对象添加自定义属性,该属性在发送到服务器的每个后续请求中都可用吗?
// Middleware function
app.use((req, res, next) => {
req.customProperty = 'some value';
next();
});
// Route handler
app.get('/example', (req, res) => {
console.log(req.customProperty); // Will this always be available?
res.send('Response');
});
我想确保添加到请求或响应对象的任何自定义属性在整个请求生命周期中都可用,而不仅仅是单个请求。有人可以澄清这是如何工作的,并提供一些关于中间件功能添加的这些属性的生命周期的见解吗?谢谢!
在 Node.js Express 应用程序中,当您使用 multer 等中间件进行文件上传、使用 cookieParser 进行 cookie 管理或任何自定义中间件时,这些中间件函数添加到请求 (req) 或响应 (res) 对象的属性仅持续存在当前请求-响应周期的持续时间。此行为是设计使然,旨在提供一种传递特定于服务器处理的每个单独请求的数据和功能的方法。
如何运作
请求-响应生命周期:
Express 服务器处理的每个 HTTP 请求都是隔离的。当请求传入时,Express 会为该请求创建新的 req 和 res 对象。处理请求的任何中间件或路由处理程序都可以修改这些对象。然而,一旦发送响应(即请求-响应周期完成),这些 req 和 res 对象将被丢弃。如果另一个请求到来,则会重新创建新的 req 和 res 对象。
中间件属性:
如果您向中间件函数中的 req 或 res 添加自定义属性,则该属性在该特定请求的整个生命周期中可用。这意味着它可以在该请求的所有后续中间件和路由处理程序中访问。这是一个简短的例子:
app.use((req, res, next) => {
req.customProperty = 'some value';
next(); //Pass control to the next middleware/route handler
});
app.get('/example', (req, res) => {
console.log(req.customProperty); // Outputs: 'some value'
res.send('Response');
});
在此示例中,req.customProperty 将在 /example 路由处理程序中可用,因为它是由中间件针对该特定请求添加的。
请求之间的隔离:
添加到 req 或 res 的自定义属性不会在不同请求之间共享。每个请求都是独立处理的,有自己的一组中间件和路由处理程序处理它。这可确保来自一个请求的数据不会无意中影响另一个请求。
中间件范围:
如果您希望某些数据或属性在每个请求中可用,则必须使用添加这些属性的应用程序级中间件(使用 app.use())。请记住,需要在每个请求的基础上添加这些属性,因为会为每个请求重新创建 req 和 res 对象。
超越请求-响应周期的持久性:
如果您需要在单个请求-响应周期的生命周期之外保留数据,则需要考虑其他存储解决方案,例如数据库、内存数据存储(例如 Redis)或在用户会话中保留数据或 cookie(针对特定于用户的数据)。
添加到中间件函数中的 req 或 res 的属性在添加它们的整个请求中都可用,但不会保留到后续请求中。每个请求都是一个新的开始,有自己的 req 和 res 对象。