You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:09:03