2015-12-08 52 views
0

多個路由器的方法共享變量讓我們假設用戶點擊URL域/ REST /音樂/頁= 2在快遞

然後在後臺,我有其他快遞路由器:

app.use('/rest', restRouter); 

地方休息路由器是這樣的

var express = require('express'); 
var restRouter = express.Router(); 

對於這個問題。如果我的路由器有以下幾種方法:

restRouter.get('*', createRequestInstance); 
restRouter.get('*', findUser); 
restRouter.get('/music/*', getMusicList); 

我想創建一些對象變量,通過解析算法和收集數據流過程中。但如果我在createRequestInstance中創建這個對象,我不知道我怎麼能把它傳遞給findUsergetMusicList我寧願不修改reqres對象或使用表達本機技術。我想先準備好一切,然後建立迴應。

我看到下面的問題

  1. 我不能定義函數定義的變量之外,因爲它會在所有請求共享。我希望每個請求都有一個唯一的對象。
  2. 函數只接受req,res,next params。而且即使綁定,我也沒有看到如何增強它的方式。
  3. 我不能調用下一個函數manualy,因爲它是通過next調用的,所以我不能在裏面傳遞額外的參數。
+0

表達方式是有一個私有變量'req._data = {}',並在請求通過中間件堆棧時構建它。你能告訴我你爲什麼反對修改'req'嗎? –

+0

當然,如果你有更多的作者,更多的路由器,並且你想分離每個路由器/方法的數據,所以它不會被意外損壞。我會說這可能是通常的做法,你可以爲下一個方法添加一些params/obj。我肯定有人不得不考慮這個,例如,當他比較'async'和'express' –

+0

嗯......只是讓你知道這正是'res.locals'所做的。它使它們成爲所有可以訪問'res'的路由器/中間件/方法的全局類型,並且不用提及所有視圖(如果有的話)。對於每個請求都有一個唯一對象,在'app/server.js'或其等價物上有'count'。然後,所有可以訪問'count'的路由/中間件/方法都可以爲每個請求創建一個唯一對象。我相信,你也應該對'res.locals'做同樣的事情。 –

回答

1

一種常見的方法是使用res.locals,這是用於這種事情。

+0

太棒了!當我通過文檔時,我不得不錯過它:) –