通过javascript循环将文档添加到ElasticSearch索引不起作用

时间:2015-05-26 10:58:27

标签: javascript loops elasticsearch

我从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);
  });
});

1 个答案:

答案 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 );
});