【发布时间】:2017-10-17 22:59:24
【问题描述】:
我正在尝试学习 Nodejs,同时学习 AWS 平台。
我正在构建一个 Lex 应用程序,该应用程序将 Lambda 函数与 AWS Elastic Search 实例结合使用。
我的搜索是基本的,正在寻找它需要的东西,问题是当我测试我的处理程序时它没有收到数据。当我将结果记录到控制台时,似乎搜索结果对象在处理程序已经打印结果之前不会被传递回处理程序函数。使用一些控制台日志我得到这个输出:
Starting handler function
Starting search
{ dialogAction:
{ type: 'Close',
fulfillmentState: 'Fulfilled',
message: { contentType: 'PlainText', content: undefined } } }
Top hit: [object Object]
内容项未定义,但应该是从 search.js 返回的 Top Hit 对象。我可以看到 TopHit 对象正在被找到,但是为什么 index.handler 函数在返回搜索响应之前打印?
我在 index.js 中的 Lambda 处理函数:
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);
};
我在 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);
}
提前感谢您的任何建议。
【问题讨论】:
-
你能在事件中记录数据吗?只是为了确保您的问题得到定义。除此之外,我会确保 resp.hits.hits 返回一个值,如果不是 - 你在弹性搜索方面做错了(可能没有正确索引),这似乎不在范围内这个问题。
-
如果我理解正确,您的内容值应该是“”“”。我可能是错的。这是未定义的吗?
-
@RamziC。好问题,但是当我从 search.js 记录 topHit 的结果时,我得到了正确的 JSON 响应,所以这不是 Elastic Search 的问题,我认为这是我的代码的问题。
-
@chandrasugur 是的,你是对的,对不起,我仔细检查了 topHit 的分配,却忘了把它改回来。在这种情况下,当我让 topHit = "" 时,我得到的结果是 """"。
标签: node.js amazon-web-services elasticsearch aws-lambda amazon-lex