问题描述
我的目标是让 twillio 调用一个 webhook,然后让一些 node js 函数记录用户所说的话,然后拨打另一个电话号码并播放该录音。
但是,我似乎无法设置拨出电话。该代码在常规节点 js 文件中工作,但一旦作为 webhook 的一部分被调用,它将无法工作:
const accountSid =
const authToken =
const client = require('twilio')(accountSid,authToken);
exports.handler = function(context,event,callback) {
console.log(event.CallSid,event.RecordingUrl);
console.log()
console.log("RECORDING URL: " + event.RecordingUrl + ".mp3");
let audioURL = event.RecordingUrl
audioURL+=".mp3";
const response = new Twilio.twiml.VoiceResponse();
response.say({ voice: 'woman',language: 'en-US' },'Thank you.');
client.calls
.create({
from: '+14********',to: '+14***********',url: 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-8.mp3'
})
callback(null,response);
};
解决方法
这里是 Twilio 开发者布道者。
这里的问题是您发出异步请求以进行调用,然后立即调用 callback
。这将终止 Twilio 函数的执行,并且因为它会立即取消该出站 API 请求。有关详细信息,请参阅 documentation on Twilio Function execution。
要解决此问题,您应该只在 callback
函数完成后调用 create
。
作为额外提示,您还可以从 context
对象获取经过身份验证的客户端,而无需自己加载您的 accountSid 或 authToken。
此外,在您的示例中,您为出站呼叫提供的 URL 似乎是 mp3。您的 URL 应返回 TwiML,或者您可以将 TwiML 作为 API 请求的一部分发送。
我会像这样更新你的函数:
exports.handler = function(context,event,callback) {
console.log(event.CallSid,event.RecordingUrl);
console.log()
console.log("RECORDING URL: " + event.RecordingUrl + ".mp3");
let audioURL = event.RecordingUrl
audioURL+=".mp3";
const client = context.getTwilioClient();
const response = new Twilio.twiml.VoiceResponse();
response.say({ voice: 'woman',language: 'en-US' },'Thank you.');
client.calls
.create({
from: '+14********',to: '+14***********',twiml: `<Response><Play>${audioUrl}</Play></Response>`
})
.then(() => {
callback(null,response);
})
.catch(error => {
callback(error);
});
};