2017-04-16 3 views
0

私はNode.jsとLexサービスには全く新しいですが、2時間オンラインで検索したところ、私の問題に対する答えは見つけられません。AWS Lex/Alexa and Lambda:Lexアプリは私のラムダ関数をどう呼びますか? event.request.typeは定義されていません

私はRESTful URLへの呼び出しを生成し、そのURLからの文字列応答を読み取るために使用される変数を単にプロンプ​​トするAlexa/Lexアプリケーションを作成しようとしています。

私の最初の努力のために、私は単にテキストファイルを求めて、サブドメインのプロンプトを表示するだけです。これは私のラムダコードです:

'use strict'; 

var https = require('http'); 

const handlers = { 

"LaunchRequest": function() { 
    // Launch Request 
    console.log(`LAUNCH REQUEST`) 
    context.succeed(
     generateResponse(
     buildSpeechletResponse("Welcome to an Alexa Skill, this is running on a deployed lambda function", true), 
     {} 
    ) 
    ) 
}, 

"GetCustomerVersion": function() { 
    var endpoint = "https://"+{customer}+".services.com/sample.txt" 
    var body = "" 
    https.get(endpoint, (response) => { 
     response.on('data', (chunk) => { body += chunk }) 
     response.on('end',() => { 
     context.succeed(
      generateResponse(
      buildSpeechletResponse(`Customer ${customer} has info `+body, true), 
      {} 
     ) 
     ) 
     }) 
    }) 
}, 

'SessionEndedRequest': function() { 
    this.emit(':tell', this.t('STOP_MESSAGE')); 
} 

} 

// Helpers 
function buildSpeechletResponse (outputText, shouldEndSession) { 

    return { 
    outputSpeech: { 
     type: "PlainText", 
     text: outputText 
    }, 
    shouldEndSession: shouldEndSession 
    } 

} 

function generateResponse (speechletResponse, sessionAttributes) { 

    return { 
    version: "1.0", 
    sessionAttributes: sessionAttributes, 
    response: speechletResponse 
    } 

} 

exports.handler = (event, context, callback) => { 
try { 
    if (event.request.type === 'LaunchRequest') { 
     handlers['LaunchRequest'](event.request, 
      event.session, 
      (sessionAttributes, speechletResponse) => { 
       callback(null, buildResponse(sessionAttributes, speechletResponse)); 
      }); 
    } else if (event.request.type === 'IntentRequest') { 
     handlers['GetCustomerVersion'](event.request, 
      event.session, 
      (sessionAttributes, speechletResponse) => { 
       callback(null, buildResponse(sessionAttributes, speechletResponse)); 
      }); 
    } else if (event.request.type === 'SessionEndedRequest') { 
     handlers['SessionEndedRequest'](event.request, event.session); 
     callback(); 
    } 
} catch (err) { 
    callback(err); 
} 
}; 

私はGetCustomerVersionでエンドポイントを構築しています方法が間違っているかなり確信しているが、本当の問題は、私はラムダ関数自体をテストするとき、私はこのエラーを取得することです:

{ 
    "errorMessage": "Cannot read property 'type' of undefined", 
    "errorType": "TypeError", 
    "stackTrace": [ 
    "exports.handler.err (/var/task/index.js:86:26)" 
    ] 
} 

私はそれがevent.request.typeいずれかeventまたはevent.request未定義であるについて叫んだけど、私は未定義するためにそれらを引き起こすもの見当もつかない - 私は、彼らが呼び出し自体によって移入されていたと思いました。

これについて詳しくは、私が読むことができますか、またはご覧になることができるドキュメントやチュートリアルはありますか?私が見たすべてのものは、Alexaアプリ(AWSのLexポータルを使用している)とは異なるインターフェースを持っているようですが、LAMBDAコードが異なるとは思っていませんでしたが、おそらくそれは私の混乱ですか?それは "私が知らないことを知らない"という問題なので、ガイダンスは大歓迎です。

ありがとうございました!

答えて

0

インターフェイスは実質的に異なるようです。

console.log(event);は適切な次のステップのようです。

http://docs.aws.amazon.com/lex/latest/dg/lambda-input-response-format.html#using-lambda-input-event-formatは、デベロッパーガイドの特定のページで、イベントフォーマットを見つけることができます。

+0

私はそのような初心者のように聞こえませんが、ラムダ機能を実行するときにはどこに 'console.log'が表示されますか?私は私のメッセージが出力に表示されているのを見ていません(まだ間違っていますが、 'console.log'の呼び出しの後まで)。また、関数のCloudWatch出力も同じデータであるようです。 – Bing

+0

CloudWatchログに登録する必要があります:http://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions.htmlそこにはありませんか? –

+0

私はおそらく間違った場所を探しています。私は単にこれを私のコード 'exports.handler =(event、context、callback)=> {try {console.log(event);}に追加しました。 //コードが下に続きます... '次に、Lambda関数の「テスト」ボタンをクリックし、CloudWatchログにラムダと同じエラーが表示され、コンソールログは表示されません:http://i.imgur.com/U7IhmXf.png – Bing

関連する問題