通过Node.js中的AWS Lambda发送POST请求

通过Node.js中的AWS Lambda发送POST请求,node.js,aws-lambda,alexa,Node.js,Aws Lambda,Alexa,当从我的Alexa技能中调用意图时,我想向Twilio发送一个POST请求。测试代码时,没有错误,但请求似乎没有通过。在Postman works中测试POST请求 function postToTwilio() { var http = require("https"); var postData = JSON.stringify({ 'To' : '1234567', 'From': '1234546', 'Url': 'https://handler.

当从我的Alexa技能中调用意图时,我想向Twilio发送一个POST请求。测试代码时,没有错误,但请求似乎没有通过。在Postman works中测试POST请求

function postToTwilio() {

var http = require("https");
var postData = JSON.stringify({
      'To' : '1234567',
      'From': '1234546',
      'Url': 'https://handler.twilio.com/twiml/blablabla',


  });

var options = {
  "method": "POST",
  "hostname": "https://api.twilio.com",
  "path": "/12344/Accounts/blablablablba/Calls.json",
  "headers": {
    "Authorization": "Basic blblablablablabla",
    "Content-Type": "application/x-www-form-urlencoded",
  }
};

var req = http.request(options, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    var body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write(postData);
req.end();

}

首先,请求是一个异步调用,因此需要让alexa等待响应

要做到这一点,您需要使用异步等待过程并使用承诺

var postData = JSON.stringify({
      'To' : '1234567',
      'From': '1234546',
      'Url': 'https://handler.twilio.com/twiml/blablabla',


  });

var options = {
  "method": "POST",
  "hostname": "https://api.twilio.com",
  "path": "/12344/Accounts/blablablablba/Calls.json",
  "headers": {
    "Authorization": "Basic blblablablablabla",
    "Content-Type": "application/x-www-form-urlencoded",
  }
};

function get(options) {
  return new Promise(((resolve, reject) => {
    const request = https.request(options, (response) => {
      response.setEncoding('utf8');
      let returnData = '';

      if (response.statusCode < 200 || response.statusCode >= 300) {
        return reject(new Error(`${response.statusCode}: ${response.req.getHeader('host')} ${response.req.path}`));
      }

      response.on('data', (chunk) => {
        returnData += chunk;
      });

      response.on('end', () => {
        resolve(JSON.parse(returnData));
      });

      response.on('error', (error) => {
        reject(error);
      });
    });
    request.write(postData)
    request.end();
  }));
}
var postData=JSON.stringify({
“至”:“1234567”,
‘From’:‘1234546’,
“Url”:”https://handler.twilio.com/twiml/blablabla',
});
变量选项={
“方法”:“发布”,
“主机名”:”https://api.twilio.com",
“路径”:“/12344/Accounts/blablba/Calls.json”,
“标题”:{
“授权”:“基本BLBLBLA”,
“内容类型”:“应用程序/x-www-form-urlencoded”,
}
};
函数get(选项){
返回新承诺(((解决、拒绝)=>{
const request=https.request(选项,(响应)=>{
response.setEncoding('utf8');
让returnData='';
如果(response.statusCode<200 | | response.statusCode>=300){
返回拒绝(新错误(`response.statusCode}:${response.req.getHeader('host')}${response.req.path}');
}
response.on('data',(chunk)=>{
returnData+=chunk;
});
响应。在('end',()=>{
解析(JSON.parse(returnData));
});
响应.on('error',(error)=>{
拒绝(错误);
});
});
请求.写入(postData)
request.end();
}));
}
然后,当调用此get函数时:

let response=wait get(选项)

我还没有作为一个整体进行测试,但这是基本骨架


让我知道这是否有效。

您在
req
上没有错误处理程序,请尝试在那里添加一个,然后查看是否报告了任何错误。如书面所述,他们可能只是没有得到处理。有关更多信息,请参阅。我认为您的Lambda功能已在post请求完成之前完成,请显示您在何处使用
posttowilio
函数和调用回调函数。嘿,感谢您的回复!我复制了你做的一切。只有一个问题,当调用get函数(让response=await api.get(options)时,我应该输入什么而不是“api”?我得到了一条消息:“意外的令牌api”对不起,刚刚调用了get(…)。我通常在外部类中调用该函数,所以我总是将其作为api调用。无论答案如何更新