0

我正在尝试从 Lambda 函数发布到 IoT 主题,该函数由 Alexa 技能触发。在 Lambda 函数中,我正在执行此 IoT 发布:

var params = {
  topic: 'testTopic',
  payload: new Buffer('test message'),
  qos: 1
};

iotData.publish(params, function(err, data) {
  if (err) console.log('ERR: ', err); // an error occurred
  else if (data) console.log('DATA: ', data);  // successful response
});

如果我在 Lambda 函数中运行此代码(并且仅此代码),它工作正常。但是如果我将 params 和 publish 函数放在 Alexa Skill 模板的 onIntent 函数中,并将其放在一个新的 Lambda 函数中,它就不起作用了。(两个 Lambda 函数具有相同的配置和策略。)

如果我注释掉 intentHandler.call(),那么 iotData.publish() 确实会运行,所以看起来 intentHandler 调用出于某种我不明白的原因正在取消它。

onIntent: function (intentRequest, session, response) {
  var intent = intentRequest.intent,
      intentName = intentRequest.intent.name,
      intentHandler = this.intentHandlers[intentName];

  if (intentHandler) {
    console.log('dispatch intent = ' + intentName);

    var params = {
      topic: 'testTopic',
      payload: new Buffer('test message'),
      qos: 1
    };

    iotData.publish(params, function(err, data) {
      if (err) console.log('ERR: ', err); // an error occurred
      else if (data) console.log('DATA: ', data);  // successful response
    });

    intentHandler.call(this, intent, session, response);
  } else {
    throw 'Unsupported intent = ' + intentName;
  }
}
4

1 回答 1

0

这似乎与 Lambda 函数上下文有关。intentHandler.call()调用有问题的意图,而后者又调用context.succeed(). 我假设这意味着 Lambda 函数在iotData.publish()调用可以执行之前完成运行,因为当我像这样intentHandler.call()将回调放入回调时iotData.publish(),一切正常:

onIntent: function (intentRequest, session, response) {
  var intent = intentRequest.intent,
      intentName = intentRequest.intent.name,
      intentHandler = this.intentHandlers[intentName];

  if (intentHandler) {
    console.log('dispatch intent = ' + intentName);

    var params = {
      topic: 'signals',
      payload: new Buffer(intentName),
      qos: 1
    };

    iotData.publish(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else {
        console.log(data);           // successful response
        intentHandler.call(this, intent, session, response);
      }     
    });
  } else {
    throw 'Unsupported intent = ' + intentName;
  }
}
于 2016-07-26T16:50:37.283 回答