提问人:h_a 提问时间:5/9/2022 更新时间:5/9/2022 访问量:270
为什么在具有 TypeError 的 catch 块中重新抛出错误
Why re-throwing error in catch block having TypeError
问:
我在 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.js
router.js
router.js
error
undefined
TypeError: expecting a function but got [object Promise]
我没有任何线索,我做错了哪里。任何帮助将不胜感激。
答:
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赞
Bergi
5/9/2022
永远不要将异步函数
作为执行器传递给新的 Promise
!
0赞
alilland
5/10/2022
我建议添加您的答案版本以回答 OP 的问题,然后突出显示它应该如何编写。我答案中上面的代码将适用于您的链接示例中的代码,来自 OP 所说的代码将不起作用
0赞
Bergi
5/10/2022
OP 尚未完成(或共享)足够的调试来判断哪些不起作用以及为什么,但这并不能改变您答案中的代码是一种不好的做法。
评论
async
Promise
await
try { const res = await axios.post("/endpoint"); return res.data; } catch (e) { console.log(e.response.data); throw e; }
return function () { /* something here */ }
Promise.try