我正在尝试使用Amazon Alexa,IoT和Lambda控制我的树莓。 到目前为止我的工作:
这是我的node.js脚本中的意图处理:
switch(event.request.intent.name) {
case "testone":
var config = {};
config.IOT_BROKER_ENDPOINT = "restAPILinkFromIoT".toLowerCase();
config.IOT_BROKER_REGION = "us-east-1";
//Loading AWS SDK libraries
var AWS = require('aws-sdk');
AWS.config.region = config.IOT_BROKER_REGION;
var iotData = new AWS.IotData({endpoint: config.IOT_BROKER_ENDPOINT});
var topic = "/test";
var output = "test output without publish"
var params = {
topic: topic,
payload: "foo bar baz",
qos:0
};
iotData.publish(params, (err, data) => {
if (!err){
output = "publish without error"
this.emit(':tell', tell);
} else {
output = err
}
});
context.succeed(
generateResponse(
buildSpeechletResponse(output, true),
{}
)
)
break;
...
基本上,脚本应该返回“无错误发布”或错误消息。问题它总是返回“没有发布的测试输出”。似乎永远不会触发发布函数(或至少是回调函数)。我也没有在主题中看到消息。
我做错了吗?
提前致谢!
答案 0 :(得分:1)
这部分:
iotData.publish(params, (err, data) => {
if (!err){
output = "publish without error"
this.emit(':tell', tell);
} else {
output = err
}
});
是异步方法调用。 iotData.publish()
方法将立即返回。然后,异步调用完成后,将在以后的某个时间执行带有if(!err) ...
代码块的匿名回调函数。
这意味着这部分:
context.succeed(
generateResponse(
buildSpeechletResponse(output, true),
{}
)
)
在IoT publish()
调用完成之前以及output
变量分配了任何内容之前调用。
要解决此问题,您可以将代码移动到回调中:
iotData.publish(params, (err, data) => {
if (!err){
context.succeed(generateResponse(
buildSpeechletResponse("publish without error", true),
{});
)
} else {
context.succeed(generateResponse(
buildSpeechletResponse(err, true),
{});
}
});
作为旁注,我真的不建议同时学习NodeJS和AWS Lambda和IoT。如果您在学习Lambda和其他AWS的同时需要学习一门语言,我建议使用Python,因为您不必在Python中处理这些异步回调问题。