Node.js中如何从函数返回第三方API响应并返回给客户端?
解决方案:第三方短信服务响应返回客户端
你的问题核心是异步请求的处理问题,当前代码里sendSms用的是回调式的request库,无法直接返回响应结果,需要调整为支持异步返回的方式,下面是具体修改方案:
1. 修改smsservice.js,将回调改为Promise
把回调风格的request调用包装成Promise,让异步结果可以被外部捕获:
var request = require("request"); module.exports.sendSms = () => { return new Promise((resolve, reject) => { var options = { 'method': 'POST', 'url': 'https://smsplus.xxxxxxx.com/api/v3/send-sms', 'headers': { 'Content-Type': 'application/json' }, body: JSON.stringify({ "api_token": "xxxxx-xxxxx-xxxxx-xxxxx", "sid": "xxxxxx", "msisdn": "xxxxxx", "sms": "Test SMS", "csms_id": "xxxxxxx" }) }; request(options, function (error, response) { if (error) { reject(error); return; } resolve(response.body); }); }); };
2. 修改app.js,使用async/await处理异步请求
将路由处理函数改为异步函数,等待sendSms的Promise结果后再返回给客户端:
// 导入sendSms函数 const { sendSms } = require('./smsservice'); app.get('/sendansms', async (req, res) => { try { const response = await sendSms(); console.log("第三方响应内容: ", response); res.send(response); } catch (error) { console.error("短信发送失败: ", error); res.status(500).send({ error: '短信发送失败' }); } })
关键说明
- 用Promise包装异步操作,是为了让异步结果可以被
await捕获,避免回调地狱 - 加入
try/catch是为了处理请求第三方API时的错误,避免服务崩溃,同时给客户端返回合理的错误响应 - 不需要把
res传递给sendSms,服务层应专注于调用第三方API,路由层负责处理请求和响应的返回
内容的提问来源于stack exchange,提问作者Manas S. Roy
相关产品推荐
相关产品推荐

