我正在Heroku上托管Twilio应用。如果用户选择某个菜单选项,我希望Twilio启动单独的外拨电话并将用户置于会议中。
这是我的handler.js
:
const VoiceResponse = require('twilio').twiml.VoiceResponse;
const client=require('twilio')(
process.env.TWILIO_ACCOUNT_SID,
process.env.TWILIO_AUTH_TOKEN
);
var request = require('request');
exports.menu = function menu(digit,sid) {
var responseTwiml;
switch(digit){
case '1':
console.log("menu: chose 1");
responseTwiml=guestCallsHost(sid);
break;
default:
doSomethingElse();
break;
}
return responseTwiml;
};
function guestCallsHost(sid){
baseUrl='/ivr/callHost';
console.log("guestCallsHost: baseUrl "+baseUrl);
conferenceName=sid;
url='/ivr/callHost?conferenceName='+sid;
var call=client.calls.create({
url:url,
to: process.env.CELL_PHONE_NUMBER,
from: process.env.TWILIO_PHONE_NUMBER,
method: 'GET'
});
const response = new VoiceResponse();
const dial = response.dial();
dial.conference(sid);
responseStr=response.toString();
return responseStr;
};
exports.callHost=function callHost(conferenceName){
const response=new VoiceResponse();
response.say("testing outbound call to host");
return response.toString();
};
以下是定义router.js
端点的/ivr/
:
const Router = require('express').Router;
const {
menu,
callHost,
} = require('./handler');
const router = new Router();
// GET: /ivr/menu
router.get('/menu', (req, res) => {
const digit = req.query.Digits;
const sid=req.query.sid;
console.log("/ivr/menu: digit "+digit);
console.log("/ivr/menu: sid "+sid);
res.send(menu(digit,sid));
});
// GET: /ivr/callHost
router.get('/callHost', (req, res) => {
console.log("reached callHost endpoint");
const conferenceName=req.query.conferenceName;
res.send(callHost(conferenceName));
});
问题是没有进行client.calls.create()
调用,但Twilio调试器或Heroku日志中没有出现错误。并且/ivr/callHost
端点未被访问,尽管它被设置为client.calls.create()
的网址。我知道client
已成功实例化为Twilio对象(我认为),因为当我列出所有方法时使用:
console.log(Object.getOwnPropertyNames(client));
然后列出所有预期的Twilio API方法。或者这可能意味着该对象已经创建但尚未使用帐户SID和身份验证令成功连接到Twilio?
我通过在https://github.com/TwilioDevEd/ivr-phone-tree-node修改应用来构建此功能,并且我能够成功使用client.calls.create()
在另一个应用中启动电话,我将其称为{{1}我实际上正在运行以启动节点应用程序的文件,因此在这种情况下,index.js
文件实际上无法从其所在位置成功提交帐户SID和身份验证令牌应用程序结构?
所以我很困惑,为什么我不能从handler.js
内部拨打电话?我可以转接来电,很明显我可以修改直播电话。
编辑:我使用:
检查了handler.js
是否能够进行API调用
client
已成功检索当前的入站呼叫的TO号码,因此显然已client
.calls(sid)
.fetch()
.then(call => console.log("call.to "+call.to)).catch(function(error){
console.log("error: "+error.toString());
});
已实例化,并且可以连接到Twilio的服务器。
答案 0 :(得分:0)
我解决了这个问题。事实证明client.calls.create()
每个the documentation for making calls都需要一个包含主机名的完整网址,而不仅仅是相对网址。
我改变了:
baseUrl='/ivr/callHost';
到
baseUrl='https://appurl.com/ivr/callHost';
现在成功生成了出站呼叫。