Ich versuche Nodejs zu lernen und gleichzeitig AWS-Plattform zu lernen.AWS Lambda mit Elastic Search verwenden, Undefined vom Such-Client erhalten
Ich erstelle eine Lex-Anwendung, die eine Lambda-Funktion mit einer AWS Elastic Search-Instanz verwendet.
Meine Suche ist grundlegend und findet, was es benötigt, die Sache ist, wenn ich meinen Handler teste, er empfängt die Daten nicht. Wenn ich die Ergebnisse in der Konsole protokolliere, scheint es so, als ob das Suchergebnisobjekt erst dann an die Handlerfunktion zurückgegeben wird, nachdem der Handler die Ergebnisse bereits gedruckt hat. Mit einigen Konsolenprotokollen ich diese Ausgabe:
Starting handler function
Starting search
{ dialogAction:
{ type: 'Close',
fulfillmentState: 'Fulfilled',
message: { contentType: 'PlainText', content: undefined } } }
Top hit: [object Object]
Der Inhalt Artikel ist nicht definiert, sondern stattdessen das Top Hit Objekt sein, das von Search.js zurückgegeben. Ich kann sehen, dass das TopHit-Objekt gefunden wird, aber warum druckt die index.handler-Funktion, bevor die Suchantwort zurückgegeben wird?
Meine Lambda-Handler-Funktion in index.js:
const search = require("./search.js");
exports.handler = (event, context, callback) => {
console.log("Starting handler function");
const questionReq = event.currentIntent.slots.question;
//console.log(questionReq);
// call Exported function from search js.Pass in string as question
const results = search.searchQuestion(questionReq);
const eventResponse = {
"dialogAction": {
"type": "Close",
"fulfillmentState": "Fulfilled",
"message": {
"contentType": "PlainText",
"content": results
}
}
};
callback(null, eventResponse);
};
Mein Elastic Suche in Search.js:
const client = require('./connection.js');
exports.searchQuestion = function(question)
{
var topHit = "";
console.log("Starting search");
client.search({
index: 'library',
type: 'dsa',
body: {
query: {
match: { "q": question }
},
}
}).then(function (resp){
topHit = resp.hits.hits[0];
console.log("Top hit: " + topHit);
}, function(err){
console.trace(err.message);
})
return JSON.stringify(topHit);
}
Vielen Dank im Voraus für alle Anregungen.
Können Sie die Daten innerhalb des Ereignisses protokollieren? Nur um sicherzustellen, dass Ihre Frage definiert ist. Abgesehen davon würde ich sicherstellen, dass resp.hits.hits einen Wert zurückgibt, wenn es nicht ist - Sie haben auf der Seite elasticsearch etwas falsch gemacht (wahrscheinlich nicht richtig indexieren), was nicht im Bereich zu sein scheint von dieser Frage. –
Wenn ich richtig verstehe, sollte Ihr Inhalt Wert "" "" sein. Ich könnte falsch liegen. Ist das nicht definiert? –
@ RamziC. Gute Frage, aber wenn ich die Ergebnisse von topHit von search.js protokolliere, bekomme ich die korrekte JSON Antwort, also ist es kein Problem mit Elastic Search, ich denke es ist ein Problem mit meinem Code. – astralbody888