我正在填充 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/