我从PostgreSQL数据库中检索了很多行(存储在result.rows
中),我想将它们添加到 ElasticSearch 索引中。
只添加一个文档可以正常工作:
var r = result.rows[0];
esClient.index({
index: 'families',
type: 'families',
id: r.family_accession,
body: {
'family_accession' : r.family_accession,
'count_seq' : r.count_seq,
'count_taxon' : r.count_taxon
}
}, function (error, response) {
console.log(error);
});
但是当我尝试将它调成循环时,它根本不起作用:
result.rows.forEach(function (r) {
esClient.index({
index: 'families',
type: 'families',
id: r.family_accession,
body: {
'family_accession' : r.family_accession,
'count_seq' : r.count_seq,
'count_taxon' : r.count_taxon
}
}, function (error, response) {
console.log(error);
});
});
答案 0 :(得分:2)
由于您在循环中调用异步代码,因此在回调执行时,调用esClient.index()
函数时出现的上下文不再存在。
您需要将其括在闭包中以保持执行上下文。
result.rows.forEach(function (r) {
(function( row ) {
esClient.index({
index: 'families',
type: 'families',
id: row.family_accession,
body: {
'family_accession' : row.family_accession,
'count_seq' : row.count_seq,
'count_taxon' : row.count_taxon
}
}, function (error, response) {
console.log(error);
});
})( r );
});