2016-06-09 48 views
0

我的應用程序不時會遇到錯誤,並導致整個事件崩潰。然後我必須登錄到服務器並每次重新啓動它。在Node和Express中處理錯誤

在網上搜索了一段時間後,我發現domains是Node內處理錯誤處理的好方法。在進一步挖掘之後,我發現domains現在已被棄用(不知道爲什麼?)。

然後我找到了一些答案,網上說用下面的代碼可以是有益的:

process.on('uncaughtException', function(err) { 
    console.log(err); 
}); 

雖然,那簡直是隻爲節點,不能表達。因此,如果代碼位於使用Express的http請求中,則沒有任何內容會返回到瀏覽器,因此將其留在緩衝區(這也可能會佔用服務器上的內存)。

在NodeJS/ExpressJS中,在保持服務器運行的同時處理錯誤的最好方法是什麼?

回答

1

您可以在server.js或其等價物的末尾有一個錯誤處理程序。 它可以像

app.use(function (err, req, res, next) { 
    if (! err) { 
     return next(); 
    } 

    res.status(500); 

    res.render('path/to/500/page'); // or send out json, what ever you need. 
}); 

東西捕捉錯誤,我的首選方法是,try catch

將所有的異步方法包裝在一個承諾中,或使用藍鳥promisify它。

在您的路線中,使用co-expressyield的承諾。

function mySexyMethod() { 
    return new Promise(function (resolve, reject) { 
     someAsyncMethod(params, function (err, data) { 
      if (err) { 
       return reject(err); 
      } 

      resolve(data); 
     }) 
    }); 
} 


/// Express router 

const wrap = require('co-express'); 

router.verb('some-route', wrap(function* (req, res, next) { 

    let val; 

    try { 
     val = yield mySexyMethod(); 
    } catch (e) { 
     return next(e); 
    } 
}); 

如果存在錯誤,錯誤處理程序,在server.js,將被調用。

對於確保該節點的過程永遠運行在服務器上,使用forever

+0

尼斯。但是不處理隱式異常(就像試圖訪問數據對象上不可用的屬性)。就像如果你要使用'resolve(data123)'而不是'resolve(data)',Node就會崩潰,而不是通過中間件錯誤處理程序發送錯誤。 – Fizzix

+0

@Fizzix - 是的,那不會由錯誤處理程序處理。在大多數情況下,linter會捕獲未定義的變量,但不會爲對象的不存在的屬性執行此操作。讓我知道你是否找到解決辦法。 –

相關問題