2016-12-31 74 views
0

我正在用節點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的函數返回?提前致謝!

+0

爲什麼您需要將回調傳遞給'handleFailure'?由於它全部是同步的,你可以返回。 – schroffl

+0

@schroffl如果沒有設置res對象,是否不可能從函數返回?如果沒有,我覺得這個問題很愚蠢...... – Zeokav

+0

「沒有設置res對象」是什麼意思?如果我正確地解釋了你的問題:你可以在調用'res.status'之前返回,或者在if語句中包裝所有東西。 – schroffl

回答

1

一個簡單的解決方案是讓句柄失效不需要回調。

function handleFailure(res) { 
    res.status(401).json({ 
    message: 'Not authorized' 
    }); 
} 

// Somewhere else in the code 
if(tokenVal.mode !== 'cust') { 
    handleFailure(res); 
    return; 
} 
else if(tokenVal.exp < Date.now()) { 
    handleFailure(res); 
    return; 
} 
+0

感謝您的回答。這兩個答案都是有意義的,而且它們都起作用,因爲它們基本上都是一樣的。意識到我甚至不需要回撥! – Zeokav

+0

Jonty幾秒鐘快一點:P 是的,他們也是這樣做的,因爲'handleFailure'返回undefined。 –

+0

安東尼奧,這發生在我身上很多次xD –

0

你可以返回handleFailure功能,所以當前函數的執行結束,並在同一時間,你正在處理的故障(發回401響應)。

function handleFailure(res) { 
    res.status(401).json({ 
    message: 'Not authorized' 
    }); 
} 

if(tokenVal.mode !== 'cust') { 
    return handleFailure(res); 
} 
else if(tokenVal.exp < Date.now()) { 
    return handleFailure(res); 
}