2017-01-20 23 views
0

以下のlamdbaコードは、Alex-app-serverを使用してローカルでテストするときには問題なく動作しますが、AWS Lambdaで公開およびテストされたときにelseステートメント内に入り、console.log OUT PUBLISH ')しかし、それは' lambda/channelnumber 'を公開しておらず、正しい応答を送ったり、「IN PUBLISH」を印刷したりしません。コードはローカルで動作しますが、AWSラムダでは動作しません

ちょうどelse文の下半分公開機能に触れないでください。

コードスニペット私は問題が

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; 

答えて

2

をあると信じている。これはあなたのコードの非同期性の可能性が高いです。

thingShadows.publish()は何を話したことはありませんが、2番目の引数としてコールバック関数が使用されているようです。おそらくこの機能は、publish()が何をしても終了したときに呼び出されます。 out publishin publish前に呼び出されること

out publish 
in publish 

は予告:ローカルで実行する場合

私はあなたが見る出力が(この順序で)であることを想像するだろう。これは、publishメソッドが非同期であるため、実行が呼び出されるとすぐに実行が継続されるためです。あなたのケースでは、publishを呼び出した直後にreturnに電話をかけています。これはおそらく、ラムダジョブが終了してからin publishに記録されることを意味します。

完全な答えを得るために残りのラムダコード/セットアップに関する情報を十分に提供していませんが、続行する前にパブリッシュ方法が完了するのを待っていることを確認する必要があります。これを達成する1つの方法は、callback object that is passed to your lambdaハンドラを使用することです:JavaScriptに新しく、全体としてのNode.jsをイム、

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

申し訳ありませんが、私は完全に一般的なソリューションとコールバックを理解しません。あなたがもう少し詳しく説明できるように、私の完全なラムダコードを含むように質問を更新しましたか?ありがとう:) – Jacksilky

関連する問題