2013-04-14 171 views
12

我有非常簡單的node.js noob問題。如何將變量傳遞給導出的路由函數?Node.js將變量傳遞給路由

routes文件

exports.gettop = function(n, req, res) { 
    console.log(n); 
    res.send(200); 
}; 

服務器文件

app.get('/api/v1/top100', routes.gettop(100)); 

錯誤:獲得()需要回調函數,但有一個[對象未定義]

回答

25

對於你的榜樣,你要創建一個新功能將關閉您的價值n。在你的情況下,你正在執行gettop並傳遞返回的值來表示你的路由,這意味着gettop需要返回路由處理程序。 (!非常有效)

exports.gettop = function(n){ 
    return function(req, res) { 
     console.log(n); 
     res.send(200); 
    }; 
}; 
7

作爲替代loganfsmyth的解決方案,你可以留下你的gettop功能,是創造的部分功能:

app.get('/api/v1/top100', routes.gettop.bind(null, 100)); 
+0

這救了我的頭痛和時間的很多!謝謝! – Tobi

+0

奇怪的是,當綁定函數(routes.gettop)是一個「繼承」方法(即,在對象的原型鏈中定義而不是作爲其自己的方法)時,此邏輯不起作用。處理程序實際上是註冊的,但它永遠不會被調用! – LexLythius

+0

@LexLythius它永遠不會被調用聽起來很奇怪。我可以想象它會被不正確的上下文調用,在我的例子中它是'null',但對於綁定方法應該可能是實例('routes')。 – robertklep

13

當你的代碼看起來像你使用快遞,您可以使用快遞應用程序本地人和表達結果當地人將變量傳遞到您的路線。雖然其他答案提出了工作解決方案,但我認爲使用快速機制來設置這些變量並不那麼突兀。

對於本地響應(See Express API reference),您首先必須在中間件或路由的某處設置變量。我會告訴中間件方法

app.use(function(req,res, next) { 
    res.locals.top = 200; 
    next(); 
}); 

然後在你的路線,你可以通過res.locals.variablename

exports.gettop = function(req, res) { 
    console.log(res.locals.top); 
    res.send(200); 
}; 

訪問此屬性如果你想使這些設置應用廣泛的一種更好的方法是使用的應用程序當地人(See Express API reference

要設置一個應用程序變量當地人可以使用

app.locals.top = 100; 

從您的路徑訪問此變量使用

exports.gettop = function(req, res){ 
    console.log(req.app.locals.top); 
    res.send(200); 
}; 
+1

在這種情況下,我更喜歡'app.set(...)'和'[req。] app.get(...)',因爲它不會有任何副作用(因爲當地人傳遞給模板)。 – robertklep

+0

我不得不在中間件函數內調用next(),所以頁面不會掛起。 –

+0

@AmirEldor謝謝!更正了這個問題 – saintedlama