我的目标是让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()
调用已超时。我如何创建通话有什么问题?
答案 0 :(得分:1)
Twilio开发者传道者在这里。
我很高兴您发现了To
和From
号码的问题。也许我可以提供一些进一步的指导,以便通过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
号码。扭转他们解决了这个问题。