Node.js Express路由内调用多个HTTPS请求并合并响应方法
在Express路由中并行发起多个HTTP请求并合并响应
首先明确:request模块已被官方弃用,推荐使用支持Promise的现代HTTP库(如axios或node-fetch),这类库更适配async/await语法,处理多请求并行逻辑更简洁。
实现步骤(以axios为例)
- 先安装依赖:
npm install axios
- 在路由文件中编写代码:
const axios = require('axios'); const router = require('express').Router(); router.get('/test', async (req, res) => { try { // 定义需要发起的多个请求,每个请求返回一个Promise const requestTasks = [ axios.get('https://api.example.com/first-data'), axios.get('https://api.example.com/second-data'), axios.post('https://api.example.com/third-data', { param: 'test' }) ]; // 并行执行所有请求,等待全部完成后获取响应数组 const responses = await Promise.all(requestTasks); // 从响应中提取数据,合并为单个JSON对象 const combinedData = { first: responses[0].data, second: responses[1].data, third: responses[2].data }; // 返回合并后的结果 res.json(combinedData); } catch (err) { // 捕获任意请求失败的异常,返回错误响应 console.error('请求出错:', err); res.status(500).json({ error: '数据获取失败', message: err.message }); } }); module.exports = router;
关键说明
Promise.all会并行执行所有传入的Promise,只有当所有请求都成功时才会返回结果数组;如果任意一个请求失败,会直接触发catch块。- axios会自动将JSON响应解析为JavaScript对象,直接通过
.data访问即可。 - 如果需要按顺序串行执行请求(效率较低,不推荐),可以逐个
await每个请求后再合并结果。
若坚持使用request模块(不推荐)
由于原生request是回调式API,需要使用它的Promise封装版本request-promise:
npm install request-promise
代码示例:
const rp = require('request-promise'); const router = require('express').Router(); router.get('/test', async (req, res) => { try { const requestTasks = [ rp.get('https://api.example.com/first-data', { json: true }), rp.get('https://api.example.com/second-data', { json: true }), rp.post('https://api.example.com/third-data', { json: true, body: { param: 'test' } }) ]; // 解构响应结果,直接获取数据 const [firstData, secondData, thirdData] = await Promise.all(requestTasks); res.json({ firstData, secondData, thirdData }); } catch (err) { res.status(500).json({ error: '请求失败', message: err.message }); } });
注意:
request及request-promise均已停止维护,长期来看建议迁移到axios、node-fetch等活跃维护的库。
内容的提问来源于stack exchange,提问作者reema
相关产品推荐
相关产品推荐

