2016-12-15 52 views
1

當NodeJS應用程序發生錯誤時,如果發生異常,服務器可能會崩潰並停止。NodeJS:防止應用程序在出錯時崩潰

如何防止出現這種情況,以便服務器永遠不會因錯誤而停止,而是返回並返回錯誤代碼?

- 編輯

這裏是引起服務器崩潰的方法(表foo不存在):

app.get('/articles/list', function(req, res) { 
    connection.query('select * from foo', function(err, rows, fields) { 
     if (err) throw err; 
     res.send(JSON.stringify(rows)); 
    }); 
}); 

- 最佳解決方案 最後,我找到了最好的解決方案我: http://rowanmanning.com/posts/node-cluster-and-express/

總之,包括使用服務器集羣,當它退出

重新啓動服務器10
+0

這似乎有點含糊,你可以隨時在關鍵區域添加一個try catch。 – dege

回答

0

作爲一般規則,您應該處理所有錯誤,並承諾在您的代碼拒絕,以避免未捕獲的異常。

對於錯誤:使用try-catch聲明

對於承諾:使用.catch方法

順便說一句節點允許您攔截uncaughtExceptionsunhandledRejection事件,但不是一個好的做法,在處理錯誤這個級別並阻止程序退出,因爲可能會產生不可預知的行爲。

-1

使用嘗試捕捉...的部分代碼,其中拋出異常

try{ 
     //youre code here 
    }catch(error){ 
     console.log(error) 
    } 
1

如果您正在使用express,您可以使用此

function clientErrorHandler (err, req, res, next) { 
    if (req.xhr) { 
     res.status(500).send({ error: 'Something failed!' }) 
    } else { 
     next(err) 
    } 
} 

app.use(clientErrorHandler); 

我建議你準備在article,它會爲你澄清很多。 JFK,注意異步錯誤捕獲,最常見的錯誤,一旦你有包裝在try-catch異步的東西。 此外,避免

process.on("uncaughException",() => {....}) 

使用這是很糟糕的,因爲當一個未捕獲的異常被拋出,你不能可靠地繼續你的程序在這個point.Let它失敗,並與daemonizer'spm2forever和等重新啓動

+0

謝謝你的迴應。我確實使用了express,但clientErrorHandler不適合我(我編輯了我的問題以插入代碼示例) – hadf

+0

@hadf我更新了答案,答案未滿。 無論如何,你的應用程序被壓制,因爲你只是重新拋出錯誤,而不是在其他地方處理。 (err){res.status(500).send(new Error(err)); } –

+0

謝謝,我找到了最適合我的解決方案。它包含使用羣集以便在發生崩潰時重新啓動節點服務器 – hadf