【问题标题】:HTTP request callback not firingHTTP 请求回调未触发
【发布时间】:2017-07-29 08:22:08
【问题描述】:

我正在为 Amazon Echo 制作技能。在我的处理程序中,我有一个意图 (SelectGardenIntent),它成功地从访问令牌中获取 user_id(用于后续 HTTP 请求),以及一个名为 gardenNumber 的变量,它是一个插槽值。为了完成请求,我需要另外两个值,garden_id 和 dev_id。我使用这个 gardenNumber 并将其传递给一个名为 getGardenId 的函数,该函数会将来自 HTTP 请求的数据之一分配给我在 index.js 中定义的变量 garden_id。 user_id 和 gardenNumber 没有问题。当函数运行时,请求没有错误,但带有响应的回调函数也没有执行。 user_id、“about to enter request”和“req done”在测试时被正确记录,但回调函数中的其他日志语句没有运行,因为它没有运行。结果是 garden_id 未定义。 dev_id 是通过另一个依赖于这个 garden_id 的方法获得的,所以 dev_id 也是未定义的。请在这个问题上帮助我。我已经在下面粘贴了相关代码。

...
var user_id, garden_id, dev_id;
...
function getGardenId (gardenNumber) {
  console.log(user_id);
  var path = '/api/rest/client/getgardeninfo?&userid=' + user_id;
  var options = {
    hostname: server_ip,
    port: 80,
    path: path,
    method: 'GET'
  }
  console.log("about to enter request");
  var req = http.request(options, (res) => {
    console.log('entered request');
    if (res.statusCode === 200) {
      console.log('successful request');
      res.setEncoding('utf8');
      var body = "";
      res.on('data', (chunk) => {
        console.log('adding data');
        body += chunk.toString();
      });
      res.on('end', () => {
        var obj = JSON.parse(body);
        console.log('successfully parsed');
        if (obj.error === 200) {
          console.log('##gardenid successfully obtained');
          garden_id = obj.data[gardenNumber - 1].id;
        } else {
          console.log("parsing error");
        }
      });
    } else {
      console.log("failed request");
    }
  }); } catch(e) {
    console.log("ERROR");
  }
  req.on('error', (e) => {
    console.error(`problem with request: ${e.message}`);
  });
  req.on('finish', () => {
    console.log('ended');
  })
  req.end();
  console.log("req done");
}
...
var handlers = {
...
'SelectGardenIntent': function () {
      //var filledSlots = delegateSlotCollection.call(this);
      var gardenNumber = this.event.request.intent.slots.Garden.value;
      user_id = this.event.session.user.accessToken;
      getGardenId(gardenNumber);
      getDevId(garden_id);
      this.emit(':tell', `OK, garden ${gardenNumber} selected, user id is ${user_id}, garden id is ${garden_id}, device id is ${dev_id}`);
 }
...
}

【问题讨论】:

    标签: javascript node.js alexa alexa-skills-kit alexa-skill


    【解决方案1】:

    您最好使用npm request 拨打电话。

    request.get({
        url: 'http://' + server_ip + '/api/rest/client/getgardeninfo?&userid=' + user_id
    }, function (err, res, body) {
        console.log(body);
    })
    

    【讨论】:

    • request 似乎是一个不错的小图书馆,http.request 应该完全可以工作。
    • 似乎没有任何改善。该请求仍然无效。
    • 请将您提出请求的完整网址发布给@MichaelXue
    • server_ip 为“www.rainconn.com”,示例 user_id 为 1037。
    • 该网址似乎有效。你安装了请求库吗?
    猜你喜欢
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2019-10-21
    • 2016-07-23
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多