Node.js中async / await的行为

时间:2017-11-01 13:48:45

标签: node.js express promise async-await

给出以下Node.js快速路由:

router.route('/user')

   .post(async function(req, res) {
       if(req.body.password === req.body.passwordConfirm) {
           try {
               var response = await userManager.addUser(req.body);
               res.status(201).send();
           } catch(err) {
               logger.error('POST /user failed with error: '+err);
               res.status(500).send({err:"something went wrong.."});
           }
       } else {
           res.status(400).send({err:'passwords do not match'});
       }
   })

和userManager中的相应函数:

var userManager = function() {

    this.addUser = async function(userobject) {
        userobject.password_hash = await genHash(userobject.password_hash);
        var user = new User(userobject);
        return await user.save();
    };

};

module.exports = userManager;

我可以安全地假设,如果catch块中的代码没有运行,那么没有错误?由于userManager.addUser及其内部的所有内容都会返回promise,如果被拒绝,则应该由catch块捕获。 或者我是否遗漏了某些内容,是否仍应检查有效性的响应?

1 个答案:

答案 0 :(得分:0)

是的,您可以安全地假设发现await userManager.addUser(req.body) 中的所有错误

如果返回的承诺被拒绝且值为x,则await关键字会确保它throw x

但这并不能确保函数调用之外没有错误,例如catch

最佳实践:

post()不期望async回调函数,因此它会忽略您隐式返回的承诺。

因此当你传递一个时,将try / catch包裹在所有内容中,因为没有人可以传递给它:

router.route('/user').post(async function(req, res) {
    try {
        if (req.body.password === req.body.passwordConfirm) {
            try {
                var response = await userManager.addUser(req.body);
                res.status(201).send();
            } catch (err) {
                logger.error('POST /user failed with error: '+err);
                res.status(500).send({err:"something went wrong.."});
            }
        } else {
            res.status(400).send({err:'passwords do not match'});
        }
    } catch (err) {
        logger.error('POST /user fatal error: '+err);
    }
})

通过这种方式,所有编程错误都会被捕获,并且永远不会被静音或作为未处理的拒绝。

或者更好的是,如果它是一个选项,请写一个需要异步函数的post