Client.calls.create()没有启动调用,但在Twilio或Heroku中没有记录错误

时间:2018-02-11 21:55:21

标签: node.js express heroku twilio

我正在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的服务器。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。事实证明client.calls.create()每个the documentation for making calls都需要一个包含主机名的完整网址,而不仅仅是相对网址。

我改变了:

baseUrl='/ivr/callHost';

baseUrl='https://appurl.com/ivr/callHost';

现在成功生成了出站呼叫。