Javascript 代码在本地工作,但不在AWS lambda上工作
以下lamdba代码在使用Alex app server进行本地测试时运行良好,但在AWS Lambda上发布和测试时,它会进入else语句并打印console.log('OUT PUBLISH'),但它不会发布'Lambda/channelnumber',也不会将正确的响应发送回我或打印'IN PUBLISH' 你知道为什么它只是完成else语句的下半部分,而不涉及publish函数吗 我认为问题所在的代码片段Javascript 代码在本地工作,但不在AWS lambda上工作,javascript,node.js,lambda,aws-lambda,Javascript,Node.js,Lambda,Aws Lambda,以下lamdba代码在使用Alex app server进行本地测试时运行良好,但在AWS Lambda上发布和测试时,它会进入else语句并打印console.log('OUT PUBLISH'),但它不会发布'Lambda/channelnumber',也不会将正确的响应发送回我或打印'IN PUBLISH' 你知道为什么它只是完成else语句的下半部分,而不涉及publish函数吗 我认为问题所在的代码片段 function (request, response) { var ch
function (request, response) {
var channelNumber = request.slot('CHANNELNUMBER');
if (_.isEmpty(channelNumber)) {
var prompt = 'I didn\'t hear a channel code. Tell me a channel code.';
response.say(prompt).shouldEndSession(true);
return true;
} else {
//Doesn't publish any of this?????
thingShadows.publish('lambda/channelNumber', channelNumber, function () {
var prompt1 = 'Okay.';
response.say(prompt1).shouldEndSession(true);
console.log('in publish');
});
////But prints this??
console.log('out publish');
return true;
}
}
完整代码
'use strict';
module.change_code = 1;
var Alexa = require('alexa-app');
var skill = new Alexa.app('smartmote');
var awsIot = require('aws-iot-device-sdk');
var deviceName = "tv";
var _ = require('lodash');
var path = require('path');
var host = "XXXXXXXXXXXXXXXXXXXX.iot.us-east-1.amazonaws.com";
//App id is the skill being used.
var app_id = "amzn1.ask.skill.YYYYYYYYYYYYYYYYYYYYY";
var thingShadows = awsIot.thingShadow({
keyPath: path.join(__dirname, '/Raspi.private.key'),
certPath: path.join(__dirname, '/Raspi.cert.pem'),
caPath: path.join(__dirname, '/root-CA.crt'),
clientId: deviceName,
region: "us-east-1",
});
var reprompt = 'I didn\'t hear a channel, tell me a channel number or name to change to that channel';
skill.launch(function (request, response) {
var prompt = 'To change channel, tell me a channel number.';
response.say(prompt).reprompt(reprompt).shouldEndSession(true);
});
skill.intent('ChannelNumberIntent', {
'slots': {
'CHANNELNUMBER': 'CHANNELID'
},
'utterances': ['{|Change|put} {|the|on} {|channel} {|to} {-|CHANNELNUMBER}']
},
function (request, response) {
var channelNumber = request.slot('CHANNELNUMBER');
if (_.isEmpty(channelNumber)) {
var prompt = 'I didn\'t hear a channel code. Tell me a channel code.';
response.say(prompt).shouldEndSession(true);
return true;
} else {
thingShadows.publish('lambda/channelNumber', channelNumber, function () {
console.log('in pub');
var prompt1 = 'Okay.';
response.say(prompt1).shouldEndSession(true);
callback();
});
console.log('out pub');
return true;
}
}
);
module.exports = skill;
这很可能是因为代码的异步性质 您还没有告诉我们thingShadows.publish()的作用,但它似乎将回调函数作为第二个参数。当
publish()
完成它所做的一切时,可能会调用此函数
在本地运行时,我会想象您看到的输出是(按以下顺序):
请注意,out publish
在in publish
之前被调用。这是因为publish
方法是异步的,所以一旦调用它,执行就会继续。在您的情况下,您在调用publish
后立即调用return
,这可能意味着您的lambda作业在有机会在publish中登录之前就结束了
关于lambda代码/设置的其余部分,您没有提供足够的信息来提供完整答案,但您需要确保在继续之前,您正在等待发布方法完成。实现这一点的一种方法是使用处理程序:
这很可能是因为代码的异步性质
您还没有告诉我们thingShadows.publish()
的作用,但它似乎将回调函数作为第二个参数。当publish()
完成它所做的一切时,可能会调用此函数
在本地运行时,我会想象您看到的输出是(按以下顺序):
请注意,out publish
在in publish
之前被调用。这是因为publish
方法是异步的,所以一旦调用它,执行就会继续。在您的情况下,您在调用publish
后立即调用return
,这可能意味着您的lambda作业在有机会在publish中登录之前就结束了
关于lambda代码/设置的其余部分,您没有提供足够的信息来提供完整答案,但您需要确保在继续之前,您正在等待发布方法完成。实现这一点的一种方法是使用处理程序:
抱歉,我对javascript和node.js都是新手,我不完全了解您的解决方案和回调。我已经更新了这个问题,加入了我完整的lambda代码,希望您能进一步解释一下?谢谢:)对不起,我对javascript和node.js都是新手,我不完全了解您的解决方案和回调。我已经更新了这个问题,加入了我完整的lambda代码,希望您能进一步解释一下?谢谢:)
out publish
in publish
exports.myHandler = function(event, context, callback) {
// Other code
thingShadows.publish('lambda/channelNumber', channelNumber, function () {
var prompt1 = 'Okay.';
response.say(prompt1).shouldEndSession(true);
console.log('in publish');
// When the publish method is complete, we can call `callback`
// to tell lambda we are done
callback();
});
}