Node.js中的异步/等待行为

NG。

给定以下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以及其中的所有内容都会返回承诺,如果承诺被拒绝,则应由catch块捕获。还是我错过了什么,仍然应该检查响应的有效性吗?

短臂

是的,你可以安全地假定所有的错误,从await userManager.addUser(req.body)被发现。

如果返回的许诺被价值拒绝x,则await关键字确保它会兑现throw x

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

最佳实践:

post()不需要async回调函数,因此它将忽略您隐式返回的promise。

因此,当您通过它时,请将所有内容都包裹起来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需要异步功能的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章