如何在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
相关产品推荐
相关产品推荐

