如何在NestJS中获取Vonage短信服务的回调返回值
解决Vonage短信API回调异步导致的返回值滞后问题
问题核心在于vonage.message.sendSms是回调风格的异步函数,await仅对Promise生效,对你当前的回调写法不起作用。所以代码里console.log(result)和return result会在回调逻辑执行前就执行,导致输出时result.error还没被赋值。
解决方法1:将回调封装为Promise
把sendSms的回调逻辑包装成Promise,让await能正确等待异步操作完成:
// 封装回调为Promise function sendSmsPromise(from, to, text) { return new Promise((resolve, reject) => { vonage.message.sendSms(from, to, text, (err, responseData) => { if (err) { console.log('1'); reject(err); } else { if (responseData.messages[0]['status'] === '0') { console.log('2'); resolve({ success: true }); } else { console.log('3'); const errorMsg = `Message failed with error: ${responseData.messages[0]['error-text']}`; reject(new Error(errorMsg)); } } }); }); } // 使用async/await调用 async function sendSmsAndCheckResult(from, to, text) { const result = {}; try { await sendSmsPromise(from, to, text); result.success = true; } catch (err) { result.error = err.message; } console.log(result); return result; }
解决方法2:直接使用Promise版本的API(如果SDK支持)
新版Vonage SDK通常支持Promise风格调用,直接去掉回调参数,用await接收返回值即可:
async function sendSmsAndCheckResult(from, to, text) { const result = {}; try { const responseData = await vonage.message.sendSms(from, to, text); if (responseData.messages[0]['status'] === '0') { console.log('2'); result.success = true; } else { console.log('3'); result.error = `Message failed with error: ${responseData.messages[0]['error-text']}`; } } catch (err) { console.log('1'); result.error = err.message; } console.log(result); return result; }
这样修改后,代码会等待短信发送的异步逻辑完成,再执行console.log(result),就能正确获取到回调里赋值的错误信息。
内容的提问来源于stack exchange,提问作者user10874312
相关产品推荐
相关产品推荐

