[英]Is it safe to use a Node.js request (req) as key to a WeakMap
我想將信息與 Node.js 請求 ( IncomingMessage
) 一起存儲。 我想用這樣的 WeakMap 來做:
const infoByRequest = new WeakMap()
// somewhere in the request handler
const setInfo = (req, info) => {
infoByRequest.set(req, info)
}
const getInfo = (req) => {
return infoByRequest.get(req)
}
這安全嗎? 我想知道 req 對象實例是否最終會被重用,因此可能無法按預期工作。
使用 Node.js 請求 (req) 作為 WeakMap 的鍵是否安全
是的,這是安全的。 req
對象不會被重用/回收。 當不再像其他對象一樣被使用時,它們會被垃圾回收。
其他人只是向req
對象添加屬性來解決此類問題,因為它是中間件設計的核心。 您會看到 Express 內置的中間件正在做這件事。
如果您真的想避免任何可能的名稱沖突,那么您可以使用Symbol
作為屬性名稱,但您必須與計划使用它的任何人共享Symbol
。 但是,您已經在考慮共享weakMap
因此您似乎可以共享一個Symbol
。
// 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(...);
});
因為 Symbols 保證是唯一的並且永遠不會與字符串沖突(它們本質上是獨立的命名空間),所以你可以保證一個唯一的屬性訪問器。 這是將符號引入到要使用的語言中的核心內容之一。
弱映射相對於符號的優勢之一是隱私。 如果您不希望任何人能夠枚舉req
對象的屬性並找到您的符號,那么weakMap 可以提供更好的隱私。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.