2016-02-26 124 views
2

我有這樣的代碼使Express.js日誌錯誤:如何在異步操作

exports.listSavedThreads = function (req, res) { 
    SavedThread.find({}).exec().then(function (data) { 
    wat.map(); 
    res.render('home/listSavedThreads'); 
    }); 
}; 

wat是不確定的變量,因此上面的代碼不工作,res.render()不會被調用,但什麼都沒有打印到控制檯,它無聲無息地失敗,瀏覽器陷入無盡的負載。

如果我做同樣的未經許:正在打印到控制檯和瀏覽器

exports.listSavedThreads = function (req, res) { 
    wat.map(); 
    res.render('home/listSavedThreads'); 
}; 

誤差,像往常一樣。

我已經能夠打印錯誤的唯一方法是通過使用try/catch

exports.listSavedThreads = function (req, res) { 
    SavedThread.find({}).exec().then(function (data) { 
    try { 
     wat.map(); 
     res.render('home/listSavedThreads'); 
    } catch(e) { 
     console.log('Error: ', e); 
    } 
    }); 
}; 

然後在控制檯中我看到:

Error: [ReferenceError: wat is not defined]

很顯然,我不能將try/catch放到每個操作中,因爲我大多需要用於開發的錯誤輸出,所以我可以看到我的拼寫錯誤和類似的東西。有沒有辦法輸出所有操作的錯誤,甚至是異步的?

+0

您正在正確使用try/catch。如果你的設計需要你一遍又一遍地寫相同的代碼,你可能會考慮一個功能分解或者如果你挖掘OO,使用多態可能也會清理它。 –

+0

@NathanielJohnson,在我寫的每一個異步函數中放入'try/catch'都會帶來一點負擔,如果我需要的只是錯誤日誌。瀏覽器在承諾內打印錯誤就好,爲什麼Node不能?我認爲,我的配置可能有問題,但我不確定在哪裏尋找。 –

回答

1

通常,在執行不使用Promise的異步調用時,通常/最佳做法是使用error-first callbacks來確保正確處理錯誤時傳遞&。這是最常用的方法,並在像async這樣的圖書館中大量使用。

由於您在代碼片段中使用Promise,我將提供一種使用Promises進行錯誤處理的方法。使用Promise的最好理由之一是因爲它們提供了很好的異常處理功能。

添加一個.catch()呼叫到您的承諾鏈。您的承諾中發生的任何錯誤將傳播到最近的.catch()處理程序。 .catch()是在.then()中提供onRejected回撥函數的替代方法。

MDN Promise .catch() Docs

Bluebird.js - Why Promises?有使用承諾時的錯誤處理的好處的一些例子。

exports.listSavedThreads = function (req, res) { 
    SavedThread.find({}) 
    .exec() 
    .then(function (data) { 
     wat.map(); 
     res.render('home/listSavedThreads'); 
    }) 
    .catch(function(err) { 
     //handle errors 
    }); 
}; 

或者,你可以只檢查是否wat仍在繼續,因此處理該場景之前定義。

exports.listSavedThreads = function (req, res) { 
    SavedThread.find({}) 
    .exec() 
    .then(function (data) { 
     if(wat) { 
     wat.map(); 
     return res.render('home/listSavedThreads'); 
     } 
     else { 
     // Handle wat undefined 
     } 
    }); 
}; 
+0

感謝您的回覆,但是,正如我所說的,我只需要進行開發,所以我可以節省查找拼寫錯誤或明顯的邏輯錯誤的時間。將'.catch()'添加到我在應用程序中所做的每一個承諾中,在節省時間方面都無濟於事。我想,我可以使用類似eslint的東西,但是Node.js默認情況下不能打印承諾中出現的錯誤,這似乎很奇怪。瀏覽器可以做到這一點。 –