我正在用節點js寫我的後端,而且由於我對節點及其異步本質相當陌生,因此需要澄清。我試圖實現的是在身份驗證失敗的情況下從中間件功能返回。我可以通過在每個條件之後使用return;
來實現,但是這樣我必須爲每個條件設置res對象的一些值。例如:從失敗時返回函數
if(recvToken) {
try {
let tokenVal = jwt.decode(recvToken, app.get('jwtToken'));
if(tokenVal.exp < Date.now()) {
res.status(401).json({
success: false,
message: 'Auth failed',
details: 'Some other details'
// And a few more fields
});
}
else if(tokenVal.mode !== 'cust') {
res.status(401).json({
success: false,
message: 'Auth failed',
details: 'Some other details'
// And a few more fields
});
}
else {
// A few more conditions, you get the gist
}
}
catch (err) {
return;
}
}
else {
return;
}
這是行得通的。但我想有一個函數來處理所有這些失敗。我搞砸了一下週圍,並結束了一句:
function handleFailure(res, cb) {
res.status(401).json({
message: 'Not authorized'
});
cb();
}
這是從所有的條件代碼調用,如:
if(tokenVal.mode !== 'cust') {
handleFailure(res, function() { return; });
}
else if(tokenVal.exp < Date.now()) {
handleFailure(res, function() { return; });
}
確保它看起來乾淨,但它並沒有因爲工作的回報在回調函數中,從回調函數返回而不是父函數。 有沒有這種類型的東西可以做到從調用handleFailure的函數返回?提前致謝!
爲什麼您需要將回調傳遞給'handleFailure'?由於它全部是同步的,你可以返回。 – schroffl
@schroffl如果沒有設置res對象,是否不可能從函數返回?如果沒有,我覺得這個問題很愚蠢...... – Zeokav
「沒有設置res對象」是什麼意思?如果我正確地解釋了你的問題:你可以在調用'res.status'之前返回,或者在if語句中包裝所有東西。 – schroffl