我的nodejs应用程序调用{{1}} API来发送SMS消息。这是API:
nexmo
在应用中,是
nexmo.message.sendSms(sender, recipient, message, options, callback);
有没有一种方法可以将其转换为如下所示的异步/等待结构:
const nexmo = new Nexmo({
apiKey: "nexmoApiKey",
apiSecret: "nexmoSecret"
}, { debug: true });
nexmo.message.sendSms(nexmo_sender_number, cell_country + to, message, {type: 'unicode'}, async (err, result) => {....});
消息发送成功后,我想将const {err, result} = nexmo.message.sendSms(nexmo_sender_number, cell_country + to, vcode, {type: 'unicode'});
if (err) {.....};
//then process result...
返回给父函数。
答案 0 :(得分:1)
nexmo-node
库目前仅支持回调。您将需要使用promisify
或bluebird
之类的东西来将sendSms函数转换为promise,并对其使用async / await。这是一个使用Node Promisify的示例
const util = require('util');
const Nexmo = require('nexmo');
const nexmo = new Nexmo({
apiKey: "nexmoApiKey",
apiSecret: "nexmoSecret"
}, { debug: true });
const sendSms = util.promisify(nexmo.message.sendSms);
async function sendingSms() {
const {err, result} = await sendSms(nexmo_sender_number, cell_country + to, message, {type: 'unicode'});
if (err) {...} else {
// do something with result
}
}
答案 1 :(得分:0)
虽然亚历克斯的解决方案很优雅。它破坏了 TypeScript 并且 util 对 promise 做了一些“隐藏的逻辑”;当它出错时,堆栈跟踪不清楚。
这也让您能够忠于 API 并自动填充属性。
所以你可以这样做(TypeScript)
/**
* Return the verification id needed.
*/
export const sendSMSCode = async (phoneNumber: string): Promise<string> => {
const result = await new Promise(async (resolve: (value: RequestResponse) => void, reject: (value: VerifyError) => void) => {
await nexmo.verify.request({
number: phoneNumber,
brand: `${Config.productName}`,
code_length: 4
}, (err, result) => {
console.log(err ? err : result)
if (err) {
reject(err)
}
resolve(result)
});
})
return result.request_id
}