Node.js中如何将POST请求的第三方接口响应返回给前端?
问题核心原因
- 变量命名冲突:Express路由回调的响应对象命名为
res,axios请求成功回调的返回值也命名为res,内层作用域的res覆盖了外层Express的响应对象,所以调用res.send时实际调用的是axios返回的响应对象,它没有send方法才会报错 - 代码存在冗余的Promise嵌套,逻辑混乱,且同步位置无法直接获取异步请求的返回结果
修正后代码
服务端代码
const axios = require('axios'); require('dotenv').config(); // 抽离Recaptcha验证逻辑,复用性更高 async function validateRecaptcha(token, secret) { try { const response = await axios.post(`https://www.google.com/recaptcha/api/siteverify?secret=${secret}&response=${token}`); return response.data; } catch (err) { console.log(err, 'recaptcha验证请求失败'); throw err; } } app.post('/Recaptcha', async (req, res) => { try { const token = req.body.token; const secret = process.env.secret; // 等待异步验证结果 const recaptchaResult = await validateRecaptcha(token, secret); console.log("recaptcha验证结果:", recaptchaResult); // 按业务逻辑返回内容给前端 if (recaptchaResult.success === true) { // 可以返回自定义内容 res.send("HELLO"); // 也可以直接返回第三方接口的完整响应:res.send(recaptchaResult) } else { res.status(400).send("人机验证失败"); } } catch (err) { res.status(500).send("服务端内部错误"); } });
前端代码优化
async function sendToken(token) { try { const response = await axios.post("http://localhost:3001/Recaptcha", {token: token}); console.log('验证请求发送成功,服务端返回:', response.data); return response.data; } catch (err) { console.log(err, '验证请求发送失败'); throw err; } }
注意事项
- 同一作用域内变量不要重名,Express的响应对象通常命名为
res,第三方请求的返回值建议命名为response等不冲突的名称 - Express路由回调可以直接声明为async函数,用await等待异步请求结果,不需要手动嵌套Promise或者多层then回调,逻辑更清晰
- 异步请求的结果只能在异步上下文(await之后、then回调内)中访问,同步执行的代码在异步请求还未完成时无法拿到返回结果
内容的提问来源于stack exchange,提问作者Levan Marston
相关产品推荐
相关产品推荐

