簡體   English   中英

使用 Node.js 請求 (req) 作為 WeakMap 的鍵是否安全

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM