在Node.js中使用async / await进行适当的错误处理

时间:2017-11-01 11:16:35

标签: node.js promise async-await

我在Node.js express app中有以下代码:

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;

我的问题是:路由中的try catch块会捕获 addUser 中引发的所有错误,还是只捕获 user.save(),因为那是返回的那个?

1 个答案:

答案 0 :(得分:7)

答案是肯定的,它将捕获try块内和所有内部函数调用中的所有错误。

async/await只是承诺的语法糖。因此,如果使用promises可以实现某些功能,那么也可以使用async/await

例如,以下两个代码段都是等效的:

使用承诺:



function bar() {
  return Promise.reject(new Error('Uh oh!'));
}

function foo() {
  return bar();
}

function main() {
  return foo().catch(e => {
    console.error(`Something went wrong: ${e.message}`);
  });
}

main();




使用async/await



async function bar() {
  throw new Error('Uh oh!');
}

async function foo() {
  await bar();
}

async function main() {
  try {
    await foo();
  }
  catch(e) {
    console.error(`Something went wrong: ${e.message}`);
  }
}

main();




事实上,由于您未在await上使用userManager.addUser,因此您的代码无效。

它还会强制您在父函数上使用async,这可能会破坏它。检查快速文档(或者只是尝试它是否有效)。

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'});
       }
   })