[英]How to Handle Unhandled promise rejection in async object method in Node.js expressjs?
我使用對象內的異步函數在express.js中發送響應
控制器代碼:
module.exports = {
async signUpEmail(req, res) {
/**
* @description Parameters from body
* @param {string} firstName - First Name
* @inner
*/
const firstName = req.body.firstName;
res.send({ success: name });
throw new Error(); // purposely Done
}
}
題:
由於signUpEmail方法在我的情況下是異步的,並且它將被拒絕,無論我的異步方法拋出什么,它都會出現Error
。(故意放在那里)
所以記錄在控制台中。
(node:13537) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error
(node:13537) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
所以我應該從我稱之為的路線處理它。
路由器代碼
const routes = require('express').Router();
const SignUpController = require('../controllers/signUpController')
// /signup
routes.post('/', SignUpController.signUpEmail);
module.exports = routes;
一些像這樣的SignUpController.signUpEmail().then(…);
但是因為我沒有在路線中調用功能,所以我只是在路過。 如何有效地完成這項工作 ?
PS:請不要提出太復雜的解決方案。 我是JS的初學者,正在學習。
我沒有使用可鏈接的路由處理程序,因為我想創建模塊化,可安裝的路由處理程序。
在您的路由中,您需要添加一個包裝器來捕獲拋出的錯誤:
let wrapper = fn => (...args) => fn(...args).catch(args[2]);
// /signup
routes.post('/', wrapper(SignUpController.signUpEmail));
使用此方法,您可以使用頂級錯誤捕獲器,並且不需要在路由中使用內部try catch塊,除非您需要在上下文中使用它們。
使用錯誤捕獲中間件來實現此目的如下:
// last middleware in chain
app.use(function(err, req, res, next) {
// handle your errors
});
現在在您的路由中,您可以拋出錯誤,並且它們將被該中間件捕獲。 我喜歡拋出自定義錯誤並處理它們的響應並登錄此中間件。
旁白:異步等待模式非常適合編寫易於人類以同步方式讀取的異步代碼。 記住,一旦你去異步,你應該保持異步! 使用像Bluebird這樣的promisification庫並在nodeback
庫上調用.promisifyAll
是強烈建議的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.