2012-06-11 45 views
10

對於只需要一個單獨的請求時提供的數據,應該在哪裏儲存? 我正在req和res對象上創建新的屬性,所以我不必將數據從函數傳遞到函數。我如何在node.js中存儲請求級變量?

req.myNewValue = 'just for this request' 

是過程對象的一個​​選項嗎?還是在所有請求中全局共享?

回答

11

如果你在談論傳遞喜歡這裏的變量:

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,那麼絕對不會。這裏的數據是全球性的,不應該被修改。

+0

的確使用保存的數據,這是一個常見的成語 - 例如退房(HTTP的[關於路線中間件快速文檔] ://expressjs.com/guide.html#route-middleware)。 –

8

在快遞4,最好的做法是將存儲在res.locals請求級別的變量。

包含響應局部變量作用範圍是 請求,並因此僅提供給在該 請求/響應循環(如果有的話)呈現的視圖(一個或多個)對象。否則,該屬性是 與app.locals相同。

此屬性對於公開請求級別信息(如 請求路徑名稱,經過驗證的用戶,用戶設置等)非常有用。

app.use(function(req, res, next){ 
    res.locals.user = req.user; 
    res.locals.authenticated = ! req.user.anonymous; 
    next(); 
}); 

process目的通過所有請求共享和每個請求不應使用。

1

如果你想跨越異步回調保存的數據,並有可能的情況,其中請求和響應對象不可用。那麼在這種情況下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);