为什么在具有 TypeError 的 catch 块中重新抛出错误

Why re-throwing error in catch block having TypeError

提问人:h_a 提问时间:5/9/2022 更新时间:5/9/2022 访问量:270

问:

我在 express.js 中有一个路由处理程序,在它里面,我正在调用一个异步函数,它应该返回我一些值。我正在使用蓝鸟承诺来处理承诺。下面是一个示例代码。

router.js
---------
router.post('/endpoint', (req, res) => {
 return Promise.try(() => serviceFile.validate())
        .then(() => {
            console.log('Response: ', response);   
})
        .catch((error) => {
             console.log('Error: ', error) // TypeError: expecting a function but got [object Promise]
})

})


serviceFile.js
--------------
async function validate() {
  return Promise.try(() => axios.post('/endpoint'))
         .then((response) => response.data)
         .catch((error) => {
         console.log('Error: ', error.response.data) // successfully printing the error data object
          throw error; 
}) 
}

当我在文件中调用时,它使请求失败(我想要的)并成功打印错误。但是我不想在这里处理错误,所以我重新抛出它并希望在文件中处理它。但是在文件中,我得到了它说,validate()Service.jsrouter.jsrouter.jserrorundefinedTypeError: expecting a function but got [object Promise]

我没有任何线索,我做错了哪里。任何帮助将不胜感激。

JavaScript 节点.js 错误处理 承诺 蓝鸟

评论

1赞 pinkfloydx33 5/9/2022
你在那里有一个功能。试着写它,不写,而是写所有的东西。至少它会更干净。asyncPromiseawaittry { const res = await axios.post("/endpoint"); return res.data; } catch (e) { console.log(e.response.data); throw e; }
0赞 pinkfloydx33 5/9/2022
也就是说,从错误中可以看出答案。您返回的是一个 Promise(对验证的调用等),其中需要一个函数。您可能需要的某个地方(我不确定在哪里,我不知道表达)或类似的东西(即返回一个新的箭头函数)return function () { /* something here */ }
0赞 Bergi 5/9/2022
你的用法似乎是多余的。你为什么要这么称呼?Promise.try
0赞 Bergi 5/9/2022
错误消息的堆栈跟踪是什么?这应该会给你一些提示,哪些代码需要一个函数

答:

0赞 alilland 5/9/2022 #1

它有点不清楚 serviceFile.validate 做了什么,除非这是您列出的第二个函数,这可能是使用 promise 的更清晰的方式

router.post('/endpoint', async (req, res) => {
  try {
    const response = await serviceFile.validate()
    console.log('Response: ', response);
  } catch (err) {
    console.log('Error: ', error)
  }
})

function validate () {
  return new Promise(async (resolve, reject) => {
    try {
      const res = await axios.post('/endpoint')
      resolve(res.data)
    } catch (err) {
      if (err.response && err.response.data) {
        reject(err.response.data)
      } else {
        reject(err)
      }
    }
  })
}

评论

0赞 alilland 5/10/2022
我建议添加您的答案版本以回答 OP 的问题,然后突出显示它应该如何编写。我答案中上面的代码将适用于您的链接示例中的代码,来自 OP 所说的代码将不起作用
0赞 Bergi 5/10/2022
OP 尚未完成(或共享)足够的调试来判断哪些不起作用以及为什么,但这并不能改变您答案中的代码是一种不好的做法。