当我尝试使用Twilio进行出站呼叫时获取Heroku H12超时请求

时间:2018-01-07 21:28:33

标签: node.js express heroku twilio

我的目标是让Twilio响应短信拨打电话,并说出短信的内容。这是我的代码:

const express = require('express');
const app=express();
const VoiceResponse=require('twilio').twiml.VoiceResponse;
//const MessagingResponse=require('twilio').twiml.MessagingResponse;
const bodyParser = require('body-parser');
const client=require('twilio')(
    process.env.TWILIO_ACCOUNT_SID,
    process.env.TWILIO_AUTH_TOKEN
);

var https=require("https");

app.use(bodyParser.urlencoded({extended: false}));

const port=process.env.PORT;
app.listen(port,()=>{
    console.log('live on port '+port);
});

app.get('/',function(req,res){
    res.send('this is the homepage GET response');
    var url=textforspeechURL("abcde");
    https.get(url,res=>{
      res.on('data', (chunk) => {
        console.log(`BODY: ${chunk}`);
      });
    });
    //res.end();
});

function textforspeechURL(textforspeech){
    return "https://myapp.herokuapp.com/getVoiceTwiml?textforspeech="+encodeURIComponent(textforspeech);
}       


app.post('/sms',(req,res)=>{
    var body=req.body.Body;
    var fromObj=req.body.From;
    var toObj=req.body.To;
    url=textforspeechURL(body);
    console.log("url to send: "+url);
    client.calls.create({
        url:url,
        to: toObj,
        from: fromObj,
        method: 'GET'
    });
});

app.get('/getVoiceTwiml',(req,res)=>{
    const response=new VoiceResponse();
    response.say(req.query.textforspeech);
    responseTwiml=response.toString();
    console.log("responseTwiml: "+responseTwiml);
    res.send(responseTwiml);
});

当我转到应用程序的主页时,控制台显示:

app[web.1]: BODY: <?xml version="1.0" encoding="UTF-8"?><Response><Say>abcde</Say></Response>

所以/getVoiceTwiml按预期执行。但是,当我向应用程序的Twilio号码发送短信时,控制台会显示:

app[web.1]: url to send: https://myapp.herokuapp.com/getVoiceTwiml?textforspeech=some%20text2018-01-07T21:21:09.875589+00:00 

heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/sms/" host=myapp.herokuapp.com request_id=ac8176bb-3a1f-4752-9685-1cd8e017fdce fwd="54.208.34.131" dyno=web.1 connect=1ms service=30000ms status=503 bytes=0 protocol=https

因此,在/sms端点,它已成功构建网址,但client.calls.create()调用已超时。我如何创建通话有什么问题?

3 个答案:

答案 0 :(得分:1)

Twilio开发者传道者在这里。

我很高兴您发现了ToFrom号码的问题。也许我可以提供一些进一步的指导,以便通过H12请求超时不会发现这类问题。

问题是你的/sms端点从未对传入的请求做出响应,所以Node只是挂在那里等待,最终超时。

由于您没有使用其他消息回复短信,因此您只需回复空<Response> TwiML。如果出现问题,您可能还想记录或抛出错误。您可以将/sms端点更新为以下内容:

app.post('/sms',(req,res)=>{
  var body=req.body.Body;
  var fromObj=req.body.From;
  var toObj=req.body.To;
  url=textforspeechURL(body);
  console.log("url to send: "+url);
  client.calls.create({
    url:url,
    to: toObj,
    from: fromObj,
    method: 'GET'
  }, (err, apiResponse) => {
    if (err) { console.error("There was an error making the call: ", err); }
    res.set('Content-Type', 'application/xml');
    res.send('<Response/>')
  });
});

这将始终以空<Response>回复,让Twilio知道您已成功收到消息。如果拨打电话时出错,也会记录下来。

答案 1 :(得分:0)

From Heroku's Error code documentation

  

H12 - 请求超时

     

HTTP请求的完成时间超过30秒。

由于对Twilio的出站呼叫,您的传入请求所花费的时间超过分配的30秒,这将花费不确定的时间。

纠正这种情况的一种方法是创建一个工作人员dyno并使用node-resque之类的东西来创建/安排任务。

因此,请求进来,您创建/安排后台作业,将任何相关信息返回给调用者(例如,允许他们检查“请求”状态的作业ID)然后作业在没有时间限制的情况下“在后台”处理。

答案 2 :(得分:0)

问题是我使用的From号码是来自入站短信的号码,而我的Twilio号码是To号码。扭转他们解决了这个问题。