【问题标题】:Using AWS Lambda with Elastic Search, getting Undefined from the search client将 AWS Lambda 与 Elastic Search 结合使用,从搜索客户端获取 Undefined
【发布时间】: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


【解决方案1】:

您的 searchQuestion 函数是异步的,它返回一个承诺。

您的代码应如下所示:

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
    search.searchQuestion(questionReq)
        .then(result => {
            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)
{
    return new Promise(function(resolve, reject) {
       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];
         return resolve(topHit);
     }, function(err){
         console.trace(err.message);
    });
  });
}

我希望这会有所帮助:)。

【讨论】:

  • @Nltin Vaja,我认为这是正确的方向,但该代码给了我一个错误:index.js:16 .then(result => { ^ TypeError: search.searchQuestion(...).then is not a function at Object.exports.handler (index.js:16:10) at Object.<anonymous> (test.js:48:7) 从我所看到的这意味着我的 searchQuestion 仍然没有正确返回承诺?我还缺少什么?
  • 请重试上述代码。另外,你也可以试试这个 --> return client.search .. 然后应该返回那个 promise。
  • @Nltin Vaja 做到了!谢谢你:)
  • @astralbody888 没问题,尽情享受吧:)
猜你喜欢
  • 1970-01-01
  • 2014-02-15
  • 2020-03-18
  • 2021-10-20
  • 2021-05-03
  • 2022-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
相关资源
最近更新 更多