Node/Express中如何将被调用函数的错误返回给主路由函数
问题修复方案
根因分析
- 你自定义的
POSTcord函数没有返回异步请求的Promise实例,且内部的catch逻辑直接吞掉了错误,没有向外抛出,外层无法感知请求失败。 - 路由逻辑中调用
POSTcord时没有加await,异步请求还没执行完成,接口就已经提前返回了200响应,外层try/catch根本捕获不到异步错误。 - 之前尝试传入
res不生效是因为接口已经提前返回了响应,重复操作res会触发Cannot set headers after they are sent to the client报错。
修复代码
第一步:调整POSTcord函数,返回Promise并透传错误
function POSTcord(lat, lng) { // 返回axios的Promise实例,错误不内部吞掉,向外抛出 return axios .post(process.env.SOS_POST_URL + process.env.SOS_POST_CODE, { batteryLevel: 100, longitude: lng, latitude: lat }) .then(res => { console.log(`statusCode: ${res.status}`) return res }) .catch(error => { console.error(error.message); // 重新抛出错误,让外层可以捕获 throw error }) }
第二步:调整路由逻辑,等待异步请求完成
你可以根据需求选择串行执行(失败就终止后续请求)或并行执行(并发请求,任意失败就整体报错):
方案1:串行执行(优先保证执行顺序,失败即停)
router.post('/test', async (req, res) => { let passedCords = req.body; try { for (const cord of passedCords) { // 等待当前请求完成,报错直接进入catch await POSTcord(cord.lat, cord.lng); } res.status(200).json({status:"success", message: "hello!"}); } catch (err) { console.error(err.message); res.status(500).send("Server error"); } });
方案2:并行执行(请求效率更高,任意失败整体终止)
router.post('/test', async (req, res) => { let passedCords = req.body; try { // 批量生成请求任务,全部成功才继续,任意失败触发catch await Promise.all(passedCords.map(cord => POSTcord(cord.lat, cord.lng))) res.status(200).json({status:"success", message: "hello!"}); } catch (err) { console.error(err.message); res.status(500).send("Server error"); } });
内容的提问来源于stack exchange,提问作者Leomania
相关产品推荐
相关产品推荐

