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

Express中如何将回调内的响应体通过res.send/res.json返回?

解决Express.js中异步请求响应传递的问题

嘿,我来帮你捋捋这个问题!你遇到的核心问题是异步操作的时序错误,再加上对https.request返回值的误解,咱们一步步拆解解决:

问题根源

  1. 异步时序错配:https.request是异步操作,你在调用.end()后立刻执行res.send(req.body),这时候外部API的响应还没完全接收,自然拿不到数据。
  2. 对象混淆:这里的var req = https.request(...)是请求对象,不是外部API返回的响应对象,它根本没有body属性——你要的响应数据在callback里的response对象中。

修复方案

我们需要在异步的响应事件里完整收集数据后,再发送给客户端:

const https = require('https'); // 别忘了引入https模块

app.get('/search', function(req, res, next) {
  const httpOptions = {
    hostname: '...com.sg',
    port: 443,
    path: '...',
    method: 'GET', // HTTP方法规范用大写
    headers: {
      Authorization: Signatures,
      ApiKey: '...',
      ApiSecret: '...',
      FINS: fins
    }
  };

  console.log('headers:', httpOptions.headers);

  // 初始化变量,用来逐步拼接所有响应数据块
  let responseBody = '';

  const externalReq = https.request(httpOptions, function(response) {
    console.log(`statusCode: ${response.statusCode}`);

    // 每次收到数据块,拼接到responseBody中
    response.on('data', function(chunk) {
      responseBody += chunk; // chunk是Buffer类型,会自动转为字符串拼接
      console.log('Received chunk: ' + chunk);
    });

    // 所有数据接收完成后,再处理并返回给客户端
    response.on('end', function() {
      console.log('Full response body:', responseBody);
      try {
        // 把字符串转为JSON对象(可选,根据需求决定是否转换)
        const parsedData = JSON.parse(responseBody);
        // 用res.json返回JSON格式响应,比res.send更符合API场景
        res.json(parsedData);
      } catch (err) {
        // 处理JSON解析失败的情况
        console.error('Failed to parse response:', err);
        res.status(500).send('Failed to process response data');
      }
    });
  });

  // 处理请求本身的错误(比如DNS解析失败、连接超时等)
  externalReq.on('error', function(err) {
    console.error('Request error:', err);
    res.status(500).send('Request to external API failed');
    // 也可以调用next(err)让全局错误处理中间件接管
    // next(err);
  });

  externalReq.end();
  // 这里不要调用next()!因为res.json已经发送了响应,next会触发后续中间件尝试修改已发送的响应,导致报错
});

关键修改点

  • 新增responseBody变量,逐步收集所有数据块,直到end事件触发才处理完整响应。
  • 把res.send/res.json移到response的end事件内,确保只有在完整接收外部API响应后,才给客户端返回数据。
  • 补充了错误处理:包括请求发起失败、JSON解析失败的场景,避免服务崩溃。
  • 移除了不必要的next()调用,防止后续中间件操作已发送的响应对象。

这样修改后,你就能在浏览器和Postman里拿到正确的响应数据啦!

内容的提问来源于stack exchange,提问作者adscumlabs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:22:38