簡體   English   中英

如何在Node.js expressjs中處理異步對象方法中的未處理的promise拒絕?

[英]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是強烈建議的。

編輯: 源 - 帶有Promises,Generators和ES7的Express中的異步錯誤處理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM