Express.js异步路由错误处理:捕获Axios请求失败并返回响应
解决Express路由中Axios请求错误无法返回响应的问题
我明白你的问题了——你的Express路由里,当Axios请求失败时,终端能看到错误日志,但客户端收不到任何响应对吧?这是因为你在catch块里只做了日志输出,没有给客户端返回响应内容。
最简单的解决方案
只需要在catch块里添加响应发送逻辑,同时设置合适的HTTP状态码(比如503表示服务不可用,更符合“无法连接”的场景),就能让客户端收到你想要的提示:
router.get('/accounts', async (req, res) => { try { const response = await axios.get(`${config.url}/accounts`, { auth: config.auth }); const data = await response.data.results; res.json(data); } catch (e) { console.log(e); // 保留日志方便后续排查问题 // 给客户端返回错误提示和状态码 res.status(503).send("Couldn't connect"); } });
为什么之前不行?
当请求进入catch块后,你只执行了console.log(e),但没有调用res对象的任何响应方法(比如send、json),客户端会一直处于等待状态,直到请求超时。添加res.status(503).send(...)后,Express会立即给客户端返回指定的状态码和文本内容。
进阶:区分不同类型的错误(可选)
如果你想更细致地处理不同错误场景(比如网络连接失败、目标服务返回HTTP错误码),可以利用Axios的错误类型判断:
router.get('/accounts', async (req, res) => { try { const response = await axios.get(`${config.url}/accounts`, { auth: config.auth }); const data = await response.data.results; res.json(data); } catch (e) { console.log(e); // 判断是否是Axios相关错误 if (axios.isAxiosError(e)) { if (!e.response) { // 无响应,说明是网络连接失败 res.status(503).send("Couldn't connect"); } else { // 目标服务返回了错误状态码(比如401、500) res.status(e.response.status).send(`Request failed: ${e.response.statusText}`); } } else { // 其他非Axios错误(比如代码逻辑错误) res.status(500).send("Internal server error"); } } });
这样可以根据不同的错误场景返回更精准的提示,同时也能保留基础的调试日志。
内容的提问来源于stack exchange,提问作者user9066046
相关产品推荐
相关产品推荐

