如何在Node.js服务端调用外部API并返回实际数据给前端
实现服务端调用外部API的修改方案
核心修改说明
你当前的控制器只拼接了URL没有实际发起请求,需要在服务端引入HTTP请求能力完成调用,再将第三方API的返回结果透传给前端。Node 18+ 版本内置了fetch API无需额外安装依赖,低版本Node可以选择安装axios或node-fetch包使用。
1 控制器代码修改(基于内置fetch实现)
注意异步请求需要搭配async/await处理,同时补充完善错误处理逻辑:
require('dotenv').config(); module.exports = { // 添加async标记为异步方法 getModel: async (req, res) => { const { buildingNumber, commodity, meter, trainStart, trainEnd, analysisStart, analysisEnd } = req.query try { // 使用URLSearchParams拼接参数,避免特殊字符转义问题 const requestUrl = new URL(process.env.API_URL); requestUrl.search = new URLSearchParams({ building_number: buildingNumber, commodity_tag: commodity, meter: meter, train_start: trainStart, train_end: trainEnd, analysis_start: analysisStart, analysis_end: analysisEnd }).toString(); // 服务端发起对外部API的请求 const externalApiRes = await fetch(requestUrl, { timeout: 10000 // 配置10秒超时避免长时间挂起 }); // 处理外部接口调用失败的情况 if (!externalApiRes.ok) { return res.status(externalApiRes.status).json({ code: externalApiRes.status, message: '调用业务接口失败' }); } // 解析外部接口返回的JSON数据 const result = await externalApiRes.json(); // 直接返回第三方接口的实际响应给前端 return res.json(result); } catch (error) { console.error('调用外部API出错:', error.message) return res.status(500).json({ code: 500, message: '服务端内部错误' }); } } }
2 可选:使用axios实现(更便捷的配置能力)
如果习惯用axios,先执行安装命令:npm install axios
然后修改控制器代码如下:
require('dotenv').config(); const axios = require('axios'); module.exports = { getModel: async (req, res) => { const { buildingNumber, commodity, meter, trainStart, trainEnd, analysisStart, analysisEnd } = req.query try { const externalApiRes = await axios.get(process.env.API_URL, { params: { building_number: buildingNumber, commodity_tag: commodity, meter: meter, train_start: trainStart, train_end: trainEnd, analysis_start: analysisStart, analysis_end: analysisEnd }, timeout: 10000 }); return res.json(externalApiRes.data); } catch (error) { console.error('调用外部API出错:', error.message) return res.status(500).json({ code: 500, message: error?.response?.data || '服务端内部错误' }); } } }
3 MVC模式代码优化建议
为了保证代码整洁易维护,可做如下拆分:
- 将第三方API调用的逻辑抽离到单独的
service层,控制器只负责参数校验、响应格式封装,不直接处理业务调用逻辑 - 将请求外部API的通用配置(超时、统一鉴权头、错误处理)封装为公共工具函数,复用代码
- 所有敏感配置(API地址、鉴权密钥)全部放在
.env文件中,禁止硬编码到业务代码里
你的路由和前端代码不需要做任何修改,调整完控制器后前端即可拿到外部API的实际响应数据。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

