![](/img/trans.png)
[英]How does node.js next() middleware function work without arguments?
[英]How does this Node.js middleware work without arguments?
我正在使用其他人為express
和passport
編寫的函數,該函數按以下方式定義了中間件(?):
function isLoggedIn(req, res, next) {
if (req.isAuthenticated()){
return next();
}
else{
req.flash('error', 'You need to be logged in to access this page');
res.redirect('/login');
}
}
此功能在路由器中的用法如下:
app.get('/page', isLoggedIn, function(req, res){
// ...
});
我不明白的是,不應該使用參數req
和res
調用該函數嗎? 也許next
回調不是必需的,因為它是app.get
的下一個參數,但是該函數如何訪問req
和res
? 我希望它被稱為如下:
app.get('/page', isLoggedIn(req, res), function(req, res){
// ...
});
不指定參數如何工作?
謝謝,
傳遞給app.get()
或app.use()
所有函數都會自動通過req, res, next
調用req, res, next
傳遞給它們。 這就是app.get()
和app.use()
的實現方式。
為了幫助您理解,此示例:
app.get('/page', function(req, res){
console.log(req.params.foo);
});
在功能上與此相同:
app.get('/page', myHandler);
function myHandler(req, res) {
console.log(req.params.foo);
});
您不想做這樣的事情:
app.get('/page', isLoggedIn(req, res), function(req, res){
// ...
});
因為在這里您嘗試執行isLoggedIn(req, res)
(當尚未定義req
和res
時),然后將其返回值傳遞給app.get()
。 那根本不是你想要的。 您需要將函數引用傳遞給app.get()
,它將在調用函數時提供參數。 任何時候將()
放在Javascript函數之后,都意味着您現在想執行它。 但是,如果僅傳遞函數名稱,則該函數引用可以存儲並在以后根據需要調用。
此代碼示例與此類似:
var result = isLoggedIn(req, res);
app.get('/page', result, function(req, res){
// ...
});
除了由於執行程序時未在程序啟動時定義req
和res
而導致錯誤的事實之外,希望您可以看到自己現在不想執行isLoggedIn()
。 相反,您只想傳遞一個函數引用,以便Express稍后可以調用它。
在這段代碼中
app.get('/page', isLoggedIn, function(req, res){
// ...
});
正在使用三個參數調用app.get
方法:
/page
基本上,這段代碼告訴Express框架,當收到針對/page
路徑的GET
請求時,它應該調用兩個函數:第一個是中間件函數,第二個是處理程序函數。
這里要注意的重要一點是它是完成工作的框架。 該框架將調用中間件函數,然后將調用處理程序函數。
我不明白的是,是否應該不使用參數req和res調用該函數?
將在get
函數內部的某個位置使用這些參數來調用它。 假設這是簡化的get
,實現為
// a super simple get that will expect a function
// and call the function with two arguments
function get( f ) {
var res = 1, req = 1;
f( res, req );
}
有傳遞功能的多種方式get
。 例如,您傳遞一個匿名函數
get( function( res, req ) {
return res + req;
}
您還可以傳遞在其他地方定義的命名函數
function isLoggedIn( res, req ) {
return res + req;
}
get( isLoggedIn );
但是,這不是您期望的:
get( isLoggedIn( res, req ) );
這里的問題是
isLoggedIn( res, req )
不再是函數聲明 。 這是一個調用 , 調用的結果取決於res
和req
是什么。 運氣好的話,該調用甚至可以產生一個數字值,這意味着get
不再使用function作為參數來調用,而是使用function調用的結果來調用。
簡而言之,要將命名函數傳遞給另一個函數,您無需指定其參數。 假定的允許這樣做的語法甚至沒有意義,因為它與實際函數調用的語法(即調用的值)沒有區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.