2017-04-16 5 views
0

Ich bin extrem neu bei Node.js und dem Lex-Dienst, aber nachdem ich 2 Stunden online gesucht habe, bin ich erstaunt, dass ich keine Antwort auf mein Problem finden kann.AWS Lex/Alexa und Lambda: Wie nennt die Lex-App meine Lambda-Funktion? event.request.type ist undefined

Ich versuche, eine Alexa/Lex-App zu erstellen, die einfach nach Variablen fragt, die zum Generieren eines Aufrufs einer RESTful-URL verwendet werden, und dann die String-Antwort von dieser URL liest.

Für meine erste Bemühung, ich frage einfach nach einer Textdatei und Aufforderung für die Subdomain. Das ist mein Lambda-Code:

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

ich ziemlich sicher bin, wie ich den Endpunkt baute in GetCustomerVersion falsch ist, aber das eigentliche Problem ist, dass, wenn ich die Lambda-Funktion zu testen selbst ich diesen Fehler:

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

ich weiß, es kreischt über die event.request.type und entweder event oder event.request ist nicht definiert, aber ich habe keine Ahnung, was bewirkt, dass sie nicht definiert werden - ich dachte, sie durch den Anruf selbst bevölkert werden wurden.

Gibt es eine Dokumentation oder ein Tutorial, das ich lesen/sehen kann, um mehr darüber zu erfahren? Alles, was ich gesehen habe, scheint eine andere Schnittstelle zur Alexa-App zu haben (wo ich das Lex-Portal in AWS verwende), aber ich würde nicht erwarten, dass sich der LAMBDA-Code unterscheidet ... aber vielleicht ist das meine Verwirrung? Es ist eine Frage von "Ich weiß nicht, was ich nicht weiß", also ist jede Anleitung willkommen.

Vielen Dank!

Antwort

0

Die Schnittstelle scheint wesentlich anders zu sein.

console.log(event); scheint wie ein geeigneter nächster Schritt.

Es sieht wie http://docs.aws.amazon.com/lex/latest/dg/lambda-input-response-format.html#using-lambda-input-event-format ist die spezifische Seite des Entwicklerhandbuchs, wo Sie das Ereignisformat finden.

+0

Ich hasse es, wie ein solcher Neuling zu klingen, aber wo ist der Ausdruck "console.log" beim Ausführen einer Lambda-Funktion? Ich sehe nicht, dass meine Nachrichten in der Ausgabe angezeigt werden (natürlich immer noch, aber nicht vor dem Aufruf von "console.log") und auch nicht in der CloudWatch-Ausgabe der Funktion (die scheinbar die gleichen Daten sind). – Bing

+0

Sollte in CloudWatch Logs sein: http://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions.html Es ist nicht da? –

+0

Ich suche wahrscheinlich am falschen Ort. Ich habe das einfach zu meinem Code 'exports.handler = (event, context, callback) => {try {console.log (event); // Code weiter unten ... 'Dann klicke ich auf die Schaltfläche" Test "in der Lambda-Funktion und mein CloudWatch-Protokoll zeigt die gleichen Fehler Lambda, keine Konsolenprotokollierung: http://i.imgur.com/U7IhmXf.png – Bing