簡體   English   中英

在 Express.js 中 res.send() 后退出

[英]Exit after res.send() in Express.js

我有一個相當簡單的 Express.js 應用程序,其中包含一個登錄組件,如果登錄失敗,我想提前退出。 我看到有跡象表明該應用程序沒有這樣做,而且我還沒有找到明確的答案來表明調用res.send()是否會停止任何進一步的處理。 這是我現在的代碼:

client.login( username, password, function( auth, client ) {
  if( !auth ) {
    res.send( 401 );
  }

  // DO OTHER STUFF IF AUTH IS SUCCESSFUL
}

如果我正確閱讀了源代碼,它應該結束請求(中止進一步處理),但我是節點的新手,所以我還沒有准備好相信我認為我正在閱讀的內容。 歸根結底,我想我主要是從更值得信賴的來源中尋找明確的答案,而不是我自己對不熟悉的源代碼的解釋。 如果send()沒有中止處理,那么正確的方法是什么?

當然,express 不能神奇地使您的 javascript 函數停止從其他地方執行。

我不喜歡 next([error]) 解決方案,因為我認為錯誤應該只用於您通常不期望的情況(例如無法訪問的數據庫或其他情況)。 在這種情況下,一個簡單的錯誤密碼就會導致錯誤。 對於普通的控制流,不使用異常/錯誤是一個常見的約定。

因此,我建議在 res.send 調用之后放置一個 return 語句,以使您的函數停止進一步執行。

client.login( username, password, function( auth, client ) {
  if( !auth ) {
    res.send( 401 );
    return;
  }

  // DO OTHER STUFF REALLY ONLY IF AUTH IS SUCCESSFUL
}

如果你使用 express 作為你的框架,你應該調用 next() 來代替。

express 中的每個處理程序接收 3 個參數(對於基本 http 取消鏈接 2),它們是reqresnext

next是一個函數,在不帶參數調用時將觸發中間件鏈中的下一個處理程序。

如果使用參數調用next ,則無論該參數的類型如何,該參數都將被解釋為錯誤。

它的簽名是next([error]) 當 next 被錯誤調用時,它不會調用中間件鏈中的下一個處理程序,而是調用錯誤處理程序。 您應該在該錯誤處理程序中處理 401 響應代碼。 有關 Express 中錯誤處理的更多信息,請參閱此內容

編輯:正如@Baptiste Costa評論的那樣,簡單地調用next()不會停止當前的執行,但會調用下一個中間件。 最好使用return next()來防止 Node 進一步拋出錯誤(例如,在can't set headers after they are sent - 錯誤)。 這包括上述常見的錯誤拋出建議:

return next(new Error([error]));

對於您的具體情況,您只需添加“else”語句:

client.login( username, password, function( auth, client ) {
    if( !auth ) {
        res.send( 401 );
    }else {
       // DO OTHER STUFF IF AUTH IS SUCCESSFUL
    }
}

或者,一般來說,您可以使用“返回”:

return res.send( 401 );

簡單地做這樣的事情來停止進一步的執行。

function (request, response, next) {
    var path = request.body.path;

    if(path === undefined){
        response.status(HttpStatus.BAD_REQUEST);
        response.send('path is required!');
    }

    next(response)
};

在這些情況下,我傾向於使用 try...catch 塊。

client.login( username, password, function( auth, client ) { 

 try{
   if(error1){
    throw {status : 401 , message : 'error1'}
   }
   if(error2){
    throw {status : 500 , message : 'error2'}
   }
 }catch(error){
   res.status(error.status).json(error.message);
 }

}

你只需要做一個 return 來結束流程:

return  res.send( 401 );

這將發回 401 響應,並且不會在流程中繼續前進。

為什么沒有人建議使用“else”塊?

if(!auth){
    // Auth fail code
    res.send 'Fail'
} else {
    // Auth pass code
    res.send 'Pass'
}

'next' 用於為“app.use(function(req, res, next));”創建自己的中間件。 如果您設置了類似“app.get(route, function(req, res));”的路由那么函數中的代碼是您可以指定代碼的地方,而無需使用“下一步”。

暫無
暫無

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

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