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

NG.*_*NG. 4 node.js promise async-await

我的Node.js express应用程序中有以下代码:

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'});
       }
   })
Run Code Online (Sandbox Code Playgroud)

和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;
Run Code Online (Sandbox Code Playgroud)

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

Jak*_*ary 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();
Run Code Online (Sandbox Code Playgroud)

使用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();
Run Code Online (Sandbox Code Playgroud)


实际上,由于您不使用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'});
       }
   })
Run Code Online (Sandbox Code Playgroud)

  • 但OP确实*不*在`try`块中使用`await` ?! (2认同)