elasticsearch,mocha.js,Node.js,Mongodb,elasticsearch,Mocha.js" /> elasticsearch,mocha.js,Node.js,Mongodb,elasticsearch,Mocha.js" />

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

Node.js 使用节点测试ElasticSearch。填充MongoDB后强制更新索引,node.js,mongodb,elasticsearch,mocha.js,Node.js,Mongodb,elasticsearch,Mocha.js,我正在填充MongoDB并在测试中添加一个before钩子。但在我查询MongoDB时,Elasticsearch似乎没有索引我在MongoDB中的数据。 我是做错了,还是应该以某种方式强制更新 function setupMongoDBRiver() { var url = 'http://127.0.0.1:9200/_river/mongodb/_meta'; var requestData = { "type": "mongodb",

我正在填充MongoDB并在测试中添加一个before钩子。但在我查询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负责

干杯,
Martin

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

让我走过这些步骤:

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

  deleteTestIndex();
  setupMongoDBRiver();
  testQuery();
这些都是异步函数。换句话说,在继续下一步之前,您需要显式地等待它们的完成(首先要删除测试索引,然后设置MongoDB river,然后运行测试查询)

一个协调异步函数的好模块是。您可以使用(或者可能使用)来协调函数调用,但这需要一些重写(例如,您的
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();
  });
});

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

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

让我走过这些步骤:

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

  deleteTestIndex();
  setupMongoDBRiver();
  testQuery();
这些都是异步函数。换句话说,在继续下一步之前,您需要显式地等待它们的完成(首先要删除测试索引,然后设置MongoDB river,然后运行测试查询)

一个协调异步函数的好模块是。您可以使用(或者可能使用)来协调函数调用,但这需要一些重写(例如,您的
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();
  });
});
(注意:这可以写得更简洁,但为了清晰起见,我使用了详细的符号)