使用Node测试ElasticSearch。填充MongoDB后强制更新索引

时间:2015-06-05 06:36:00

标签: node.js mongodb elasticsearch mocha

我填充MongoDB并在我的测试中添加river-mongodb之前的挂钩。但是当我查询时,看起来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处理?

干杯, 马丁

1 个答案:

答案 0 :(得分:0)

您的before()函数有一些注意事项,似乎表明您还没有完全掌握异步函数调用在Node上的工作方式。

让我介绍一下步骤:

  DatabaseHelper.restoreAll(mongoUrl, done);

我假设此函数将MongoDB重置或恢复为预定义状态。你完成后调用Mocha的done回调(向Mocha发出before()已完成的信号),然后继续调用其他函数。当所有准备就绪时,您应该致电done,而不仅仅是第一个功能。

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

这些都是异步功能。换句话说,您需要在继续下一步之前明确等待完成(您首先想要删除测试索引,然后设置MongoDB河, 然后运行测试查询。)

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

假设您重写代码以使用完成回调,您的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();
  });
});

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