[英]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),它們是req
、 res
和next
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.