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

4

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

并且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()抛出的错误,因为它是返回的内容?


addUser 是一个 async function,因此永远不会抛出异常。它只会返回一个可能被拒绝的 promise。 - Bergi
2
只有当您使用await调用addUser时... - James
啊,好发现,我忘记在那里添加了! - NG.
1个回答

12

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

async/await只是Promise的语法糖。因此,如果使用Promise可以实现某项操作,那么使用async/await也是可以的。

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

使用Promise:

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();


实际上,你的代码不会起作用,因为你没有在 userManager.addUser 上使用 await

这也迫使你在父函数中使用 async,这可能会破坏一些东西。请查看 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'});
       }
   })

2
但是 OP 在 try 块内部 没有 使用 await ?! - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接