簡體   English   中英

不帶參數的Node.js中間件如何工作?

[英]How does this Node.js middleware work without arguments?

我正在使用其他人為expresspassport編寫的函數,該函數按以下方式定義了中間件(?):

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){
    // ...
});

我不明白的是,不應該使用參數reqres調用該函數嗎? 也許next回調不是必需的,因為它是app.get的下一個參數,但是該函數如何訪問reqres 我希望它被稱為如下:

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) (當尚未定義reqres時),然后將其返回值傳遞給app.get() 那根本不是你想要的。 您需要將函數引用傳遞給app.get() ,它將在調用函數時提供參數。 任何時候將()放在Javascript函數之后,都意味着您現在想執行它。 但是,如果僅傳遞函數名稱,則該函數引用可以存儲並在以后根據需要調用。

此代碼示例與此類似:

var result = isLoggedIn(req, res);

app.get('/page', result, function(req, res){
    // ...
});

除了由於執行程序時未在程序啟動時定義reqres而導致錯誤的事實之外,希望您可以看到自己現在不想執行isLoggedIn() 相反,您只想傳遞一個函數引用,以便Express稍后可以調用它。

在這段代碼中

app.get('/page', isLoggedIn, function(req, res){
    // ...
});

正在使用三個參數調用app.get方法:

  1. 頁面的路由: /page
  2. 中間件功能
  3. 請求處理函數

基本上,這段代碼告訴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 )

不再是函數聲明 這是一個調用調用的結果取決於resreq是什么。 運氣好的話,該調用甚至可以產生一個數字值,這意味着get不再使用function作為參數來調用,而是使用function調用的結果來調用。

簡而言之,要將命名函數傳遞給另一個函數,您無需指定其參數。 假定的允許這樣做的語法甚至沒有意義,因為它與實際函數調用的語法(即調用的值)沒有區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM