首页 > 解决方案 > 如何将 2 个逻辑块放在 nodeJs 中的同一异步路由中?

问题描述

我有一个调用服务的 post 路由,并有一个 .catch 处理程序来处理任何错误,代码本身也有 try-catch 块。但是,当我尝试仅调用另一个服务时,不需要第一个服务回调值,它会显示以下错误。例如。Await 不能在异步之外使用,或者当它进入条件 2 时,应用程序崩溃。这是结构-

router.post('/Students', async(req,res) => {
try{
...
studentService(req.body). then ((res)=>{
....// if res.body == 'Student'
.....
res.send(res.body)
}
})
.catch(error){
....
}
catch(err){
....
}
}

module.exports = router

现在我如何检查 res.body!='Student' 或 studentService 是否失败,然后转到调用另一个服务并拥有自己的错误处理程序的第二个块。(注意 - 它仅在第一个为 false 或所需值时执行未获得)

不知道在哪里以及如何放置它。

标签: node.jsexpressasync-await

解决方案


我猜asynce在您的示例代码中是一个错字。

在异步函数中,您可以使用 await 而不是 .then()。

此外,最好不要res用 studentService 的输出覆盖您的路线。

而且,在一条路线中,您必须在所有情况下都做某事。发送结果,抛出错误,发送错误,等等。你的else一面if在你的样本中没有做任何事情。

您可以通过使用参数调用 express 来引发错误next()

所以试试这个。

const createError = require('http-errors')

...

router.post('/Students', async(req, res, next) => {
  try {
    ...
    const student = await studentService(req.body)
    if (student.body === 'Student') {
      ...
      return res.send(student.body)
    }
  catch (error) {
     return next(error)
  }
  try {
    const something = await someOtherService(req.body)
    if (something.whatever === 'Underpaid Adjunct Faculty') {
      return res.send(something.body)
    }
  } catch (error) {
    return next(error)
  }
  return next(createError(400, 'Got an error'))
}

module.exports = router

推荐阅读