如何在Node.js expressjs中处理异步对象方法中的未处理的promise拒绝?

Ank*_*and 7 javascript node.js express async-await ecmascript-2017

我使用对象内的异步函数在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
    }
}
Run Code Online (Sandbox Code Playgroud)

题:

由于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.
Run Code Online (Sandbox Code Playgroud)

所以我应该从我称之为的路线处理它.

路由器代码

    const routes = require('express').Router();
const SignUpController = require('../controllers/signUpController')

// /signup
routes.post('/', SignUpController.signUpEmail);

module.exports = routes;
Run Code Online (Sandbox Code Playgroud)

一些像这样的SignUpController.signUpEmail().then(…);但是因为我没有在路线中调用功能我只是路过.如何有效地完成这项工作

PS:请不要提出太复杂的解决方案.我是JS的初学者,正在学习.

我没有使用可链接的路由处理程序,因为我想创建模块化,可安装的路由处理程序.

官方文件示例

Kyl*_*son 6

在您的路由中,您需要添加一个包装器来捕获抛出的错误:

let wrapper = fn => (...args) => fn(...args).catch(args[2]);

// /signup
routes.post('/', wrapper(SignUpController.signUpEmail));
Run Code Online (Sandbox Code Playgroud)

使用此方法,您可以使用顶级错误捕获器,并且不需要在路由中使用内部try catch块,除非您需要在上下文中使用它们.

使用错误捕获中间件来实现此目的如下:

// last middleware in chain

app.use(function(err, req, res, next) {
    // handle your errors
});
Run Code Online (Sandbox Code Playgroud)

现在在您的路由中,您可以抛出错误,并且它们将被该中间件捕获.我喜欢抛出自定义错误并处理它们的响应并登录此中间件.

旁白:异步等待模式非常适合编写易于人类以同步方式读取的异步代码.记住,一旦你去异步,你应该保持异步!强烈建议使用诸如Bluebird之类的promisification库并.promisifyAllnodeback库上调用.

编辑:源 - 带有Promises,Generators和ES7的Express中的异步错误处理