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

4

我希望当我的Alexa技能被调用时,可以向Twilio发送一个POST请求。在测试代码时,没有任何错误,但是请求似乎无法传达。在Postman中测试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();

}

1
你的 req 上没有错误处理程序,请尝试在那里添加一个并查看是否报告任何错误。按照现有的写法,可能只是没有被处理。有关更多信息,请参见文档 - Michael Pratt
我认为你的 Lambda 函数在 post 请求完成之前已经完成了,展示你使用 postToTwilio 函数的地方,并调用回调函数。 - hoangdv
1个回答

3

首先,请求是异步调用,因此您需要让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();
  }));
}

那么,当你调用这个get函数时:

let response = await get(options)

我还没有整体测试,但这是基本的框架。

如果可以,请告诉我。


嘿,谢谢你的回复!我复制了你所做的一切。只有一个问题,当调用get函数(let response = await api.get(options))时,我应该输入什么而不是“api”?我收到了消息:“意外的令牌api”。 - NL97
抱歉,只是调用了get(...)函数。 通常我会在外部类中进行该调用,所以我总是将其称作api.whatever。回答已更新。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接