對於只需要一個單獨的請求時提供的數據,應該在哪裏儲存? 我正在req和res對象上創建新的屬性,所以我不必將數據從函數傳遞到函數。我如何在node.js中存儲請求級變量?
req.myNewValue = 'just for this request'
是過程對象的一個選項嗎?還是在所有請求中全局共享?
對於只需要一個單獨的請求時提供的數據,應該在哪裏儲存? 我正在req和res對象上創建新的屬性,所以我不必將數據從函數傳遞到函數。我如何在node.js中存儲請求級變量?
req.myNewValue = 'just for this request'
是過程對象的一個選項嗎?還是在所有請求中全局共享?
如果你在談論傳遞喜歡這裏的變量:
http.createServer(function (req, res) {
req.myNewValue = 'just for this request';
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
那是完全沒有問題,你在做什麼。 req
存儲請求數據,您可以根據需要修改它。如果您使用的是像快一些框架,那麼它應該是罰款,以及(記住,你可能會覆蓋req
對象的一些內置的屬性)。
如果「程序對象」你指的全局變量process
,那麼絕對不會。這裏的數據是全球性的,不應該被修改。
在快遞4,最好的做法是將存儲在res.locals請求級別的變量。
包含響應局部變量作用範圍是 請求,並因此僅提供給在該 請求/響應循環(如果有的話)呈現的視圖(一個或多個)對象。否則,該屬性是 與app.locals相同。
此屬性對於公開請求級別信息(如 請求路徑名稱,經過驗證的用戶,用戶設置等)非常有用。
app.use(function(req, res, next){
res.locals.user = req.user;
res.locals.authenticated = ! req.user.anonymous;
next();
});
的process
目的通過所有請求共享和每個請求不應使用。
如果你想跨越異步回調保存的數據,並有可能的情況,其中請求和響應對象不可用。那麼在這種情況下continuation-local-storage包,是有幫助的。
它用於訪問數據或從一個點是不容易接近當前明確請求/響應。它使用命名空間的概念。
這是我如何設置這個
安裝continuation-local-storage
包
npm install continuation-local-storage --save
創建命名空間
let app = express();
let cls = require('continuation-local-storage');
let namespace = cls.createNamespace('com.domain');
然後中間件
app.use((req, res, next) => {
var namespace = cls.getNamespace('com.domain');
// wrap the events from request and response
namespace.bindEmitter(req);
namespace.bindEmitter(res);
// run following middleware in the scope of the namespace we created
namespace.run(function() {
// set data on the namespace, makes it available for all continuations
namespace.set('data', "any_data");
next();
});
})
現在的任何文件或功能,您可以得到這樣的命名空間,並在其中
//logger.ts
var getNamespace = require("continuation-local-storage").getNamespace;
let namespace = getNamespace("com.domain");
let data = namespace.get("data");
console.log("data : ", data);
的確使用保存的數據,這是一個常見的成語 - 例如退房(HTTP的[關於路線中間件快速文檔] ://expressjs.com/guide.html#route-middleware)。 –