我填充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处理?
干杯, 马丁
答案 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();
});
});
(注意:这可以写得更简洁,但为了清晰起见,我使用了详细的符号)