node.js - 使用 Node.js 测试 ElasticSearch填充 MongoDB 后强制更新索引

标签 node.js mongodb elasticsearch mocha.js

我正在填充 MongoDB 并添加 river-mongodb在我的测试中的 before 钩子(Hook)中。但当我查询时,Elasticsearch 似乎没有对我在 MongoDB 中的数据建立索引。 我是否做错了,或者我应该以某种方式强制更新?

  function setupMongoDBRiver() {
      var url = 'http://127.0.0.1:9200/_river/mongodb/_meta';
      var requestData = {
          "type": "mongodb",
          "mongodb": {
              "db": "harvester-test",
              "collection": "entries"
          },
          "index": {
              "name": "harvester-test",
              "type": "entries"
          }
      };
      request({
          url: url,
          method: 'PUT',
          body: JSON.stringify(requestData)
      },
  }



 describe('Entries Test Parameters', function() {
    before(function(done) {
        DatabaseHelper.restoreAll(mongoUrl, done);
        deleteTestIndex();
        setupMongoDBRiver();
        testQuery();  
       // ^ curl http://127.0.0.1:9200/harvester-test/entries/_search?pretty=true&q=*:*
    }

testQuery 不返回我放入 MongoDB 中的内容。难道 ES 需要更多时间来索引数据? 我是否必须指定 ES 索引,还是由 River-mongodb 处理?

干杯, 马丁

最佳答案

关于 before() 函数,有几点需要注意,这似乎表明您尚未完全掌握异步函数调用在 Node 上的工作原理。

让我逐步完成这些步骤:

  DatabaseHelper.restoreAll(mongoUrl, done);

我假设此函数会将您的 MongoDB 重置或恢复到预定义的状态。当 Mocha 完成时,您将调用它的 done 回调(这向 Mocha 发出 before() 已完成的信号),但仍继续调用其他函数。当一切准备就绪时,您应该调用done,而不仅仅是第一个函数。

  deleteTestIndex();
  setupMongoDBRiver();
  testQuery();

这些都是异步函数。换句话说,您需要显式等待它们完成,然后才能继续下一步(您首先要删除测试索引,然后设置 MongoDB River,然后运行测试查询)。

协调异步函数的一个很好的模块是 async 。您可以使用async.series (或者可能 async.waterfall )来协调您的函数调用,但这需要一些重写(例如,您的 setupMongoDBRiver() 函数不会调用完成回调)。

假设您重写代码以使用完成回调,您的 before() 将类似于以下内容:

before(function(done) {
  async.series([
    function(next) {
      DatabaseHelper.restoreAll(mongoUrl, next);
    },
    function(next) {
      deleteTestIndex(next);
    },
    function(next) {
      setupMongoDBRiver(next);
    },
    function(next) {
      testQuery(next);
    }
  ], function(err) {
    if (err) return done(err);
    done();
  });
});

(注意:这可以写得更简洁,但为了清楚起见,我使用了详细的符号)

关于node.js - 使用 Node.js 测试 ElasticSearch填充 MongoDB 后强制更新索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30659881/

相关文章:

Elasticsearch:如何按嵌套对象中的总和值进行过滤?

node.js - 创建使用 Mongoose 更新和保存文档的方法?

node.js - 为 Telegram、Facebook、Slack 等平台定制有效负载,用于 Nodejs 中的 DialogFlow

node.js - 在浏览器中显示基线 h264 帧流

mongodb - 在 MongoDB 聚合中合并数组字段

mysql - 在搜索引擎上为每个单词添加分数

linux - 日志和ELK栈在不同的服务器上,如何显示日志?

javascript - node.js/express 在不从当前页面重定向的情况下发出发布请求

spring - 如何在 spring boot 中为 mongodb 存储库进行自定义排序查询?

mongodb - 如何通过 Spark 查询 MongoDB 进行地理空间查询