Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 代码在本地工作,但不在AWS lambda上工作_Javascript_Node.js_Lambda_Aws Lambda - Fatal编程技术网

Javascript 代码在本地工作,但不在AWS lambda上工作

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

以下lamdba代码在使用Alex app server进行本地测试时运行良好,但在AWS Lambda上发布和测试时,它会进入else语句并打印console.log('OUT PUBLISH'),但它不会发布'Lambda/channelnumber',也不会将正确的响应发送回我或打印'IN PUBLISH'

你知道为什么它只是完成else语句的下半部分,而不涉及publish函数吗

我认为问题所在的代码片段

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();
  });  
}