Javascript 使用Node.js请求(req)作为WeakMap的密钥安全吗

Javascript 使用Node.js请求(req)作为WeakMap的密钥安全吗,javascript,node.js,Javascript,Node.js,我想将信息与Node.js请求一起存储(IncomingMessage)。我想用这样一个弱贴图: const infoByRequest=new WeakMap() //在请求处理程序中的某个地方 const setInfo=(请求,信息)=>{ infoByRequest.set(请求,信息) } const getInfo=(请求)=>{ 返回infoByRequest.get(请求) } 这安全吗?我想知道req对象实例是否最终得到重用,因此可能无法按预期工作 使用Node.js请求(r

我想将信息与Node.js请求一起存储(
IncomingMessage
)。我想用这样一个弱贴图:

const infoByRequest=new WeakMap()
//在请求处理程序中的某个地方
const setInfo=(请求,信息)=>{
infoByRequest.set(请求,信息)
}
const getInfo=(请求)=>{
返回infoByRequest.get(请求)
}
这安全吗?我想知道req对象实例是否最终得到重用,因此可能无法按预期工作

使用Node.js请求(req)作为WeakMap的密钥安全吗

是的,它是安全的<代码>请求对象不被重用/回收。它们不再像其他对象一样使用时会被垃圾收集


其他人只是向
req
对象添加属性来解决这类问题,因为它是中间件设计的核心。您可以看到Express中内置的中间件正是这样做的

如果确实希望避免任何可能的名称冲突,则可以使用
符号
作为属性名称,但必须与计划使用该符号的任何人共享
符号
。但是,您已经在考虑共享
weakMap
,因此您似乎可以共享
符号

// create symbol upon startup
const mwSymbol = Symbol("myMiddlewareTag");

// middleware sets some data on the req object using the symbol
app.use((req, res, next) => {
    req[mwSymbol] = someData;
    next();
});

// request handler later accessing the same data
app.get((req, res) => {
    let data = req[mwSymbol];
    // do something with data
    req.send(...);
});
因为符号被保证是唯一的,并且永远不会与字符串冲突(它们本质上是独立的名称空间),所以您被保证有一个唯一的属性访问器。这是符号被引入语言的核心内容之一


与符号相比,weakMap的一个优点是隐私。如果您不希望任何人能够枚举
req
对象的属性并找到您的符号,那么weakMap可以提供更好的隐私

使用Node.js请求(req)作为WeakMap的密钥安全吗

是的,它是安全的<代码>请求
对象不被重用/回收。它们不再像其他对象一样使用时会被垃圾收集


其他人只是向
req
对象添加属性来解决这类问题,因为它是中间件设计的核心。您可以看到Express中内置的中间件正是这样做的

如果确实希望避免任何可能的名称冲突,则可以使用
符号
作为属性名称,但必须与计划使用该符号的任何人共享
符号
。但是,您已经在考虑共享
weakMap
,因此您似乎可以共享
符号

// create symbol upon startup
const mwSymbol = Symbol("myMiddlewareTag");

// middleware sets some data on the req object using the symbol
app.use((req, res, next) => {
    req[mwSymbol] = someData;
    next();
});

// request handler later accessing the same data
app.get((req, res) => {
    let data = req[mwSymbol];
    // do something with data
    req.send(...);
});
因为符号被保证是唯一的,并且永远不会与字符串冲突(它们本质上是独立的名称空间),所以您被保证有一个唯一的属性访问器。这是符号被引入语言的核心内容之一



与符号相比,weakMap的一个优点是隐私。如果您不希望任何人能够枚举
req
对象的属性并找到您的符号,那么weakMap可以提供更好的隐私。

为什么要这样做,请求对象只能在您处理它时使用,为什么要将其与其他对象一起保留?也许可以查看rabbitmq这样的消息队列,这些函数是如何使用的?它们是传递给express“
app.get(…)
还是
app.post(…)
等的回调函数?如果是这种情况,
setInfo
中的
req
将与
getInfo
中的
req
不是同一个对象(
infoByRequest.get(req)
将始终返回
undefined
),它在处理程序中使用(实际上是下一个.js页面getinitials)我希望信息只在同一个处理程序调用中保持一致。我看不到有意义的方法来做到这一点。使用弱映射意味着您的意图是当请求完成时信息消失,因此为什么不简单地在req中注入信息并在处理程序链中向上使用它呢?你能更好地解释一下你的预期用途吗?我很确定它们不会被重用(池化),因为许多中间件已经在请求对象上存储了上下文内容。为什么你要这样做,请求对象只在你处理它时才被使用,你为什么要将它与其他对象一起保存?也许可以查看rabbitmq这样的消息队列,这些函数是如何使用的?它们是传递给express“
app.get(…)
还是
app.post(…)
等的回调函数?如果是这种情况,
setInfo
中的
req
将与
getInfo
中的
req
不是同一个对象(
infoByRequest.get(req)
将始终返回
undefined
),它在处理程序中使用(实际上是下一个.js页面getinitials)我希望信息只在同一个处理程序调用中保持一致。我看不到有意义的方法来做到这一点。使用弱映射意味着您的意图是当请求完成时信息消失,因此为什么不简单地在req中注入信息并在处理程序链中向上使用它呢?你能更好地解释一下你的预期用途吗?我很确定它们不会被重用(池化),因为许多中间件已经在请求对象上存储了上下文内容。只是为了增加另一个潜在的好处,它使使用express和TypeScript变得更容易,因为您可以将WeakMap值用作“上下文”,它比原始
req
对象更容易键入。为了增加这一点的另一个潜在好处,它使使用express和TypeScript更容易,因为您可以将WeakMap值用作比原始
req
对象更容易键入的“上下文”。