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

如何在MEAN Stack的Express GET API中返回hsResponse函数的结果

解决方法:在Express路由中异步获取request库的响应结果

嘿,这个问题核心是处理异步操作的结果传递——因为request库是基于回调的异步方法,你原来的写法里,hsResponse只是触发了请求,但路由函数根本等不到它返回的body就已经把'Root API'发出去啦。下面给你两种实用的解决方式:

1. 把hsResponse封装成Promise函数

首先,我们需要把原来的回调式请求改成返回Promise的形式,这样就能在路由里用异步语法获取结果:

// 重构hsResponse为返回Promise的函数
function hsResponse() {
  return new Promise((resolve, reject) => {
    request({ 
      proxy: proxyUrl, 
      url: request_data.url, 
      headers: request_data.headers, 
      method: request_data.method, 
      form: oauth.authorize(request_data) 
    }, function (error, response, body) {
      if (error) {
        // 请求出错时,把错误传递出去
        reject(error);
        return;
      }
      console.log(body);
      // 请求成功时,把body作为结果返回
      resolve(body);
    });
  });
}

2. 在Express路由中异步调用这个函数

现在可以用async/await或者.then()的方式在路由里获取结果,替换原来的响应内容:

方式一:使用async/await(更简洁易读)

app.get('', async (req, res) => {
  try {
    // 等待hsResponse返回结果
    const responseBody = await hsResponse();
    // 把获取到的body作为API响应返回
    res.send(responseBody);
  } catch (error) {
    // 处理请求失败的情况,返回错误提示和500状态码
    console.error('获取数据失败:', error);
    res.status(500).send('Failed to fetch data');
  }
});

方式二:使用.then().catch()(传统异步链式写法)

如果你的Node.js版本不支持async/await(现在很少见了),可以用这种方式:

app.get('', (req, res) => {
  hsResponse()
    .then(responseBody => {
      res.send(responseBody);
    })
    .catch(error => {
      console.error('获取数据失败:', error);
      res.status(500).send('Failed to fetch data');
    });
});

额外注意事项

  • 确保proxyUrl、request_data、oauth这些变量在hsResponse函数的作用域内是可访问的;
  • 如果返回的body是JSON格式,你可以在resolve之前解析它:resolve(JSON.parse(body)),这样res.send会自动把它作为JSON响应返回;
  • 一定要处理错误,不然当请求失败时,客户端会一直处于等待状态,或者收到默认的500错误,不利于排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:13:21