.push()没有将MongoDB对象添加到数组中

时间:2016-03-18 07:04:02

标签: node.js mongodb asynchronous

我已经设置了node和mongodb并将一些yelp数据导入到mongo中。当我使用mongo shell查询时,我可以看到有文档,一切都很好。但是我无法通过将它们添加到数组并返回该数组来传递它们。当我点击localhost:3000 / api / reviews时,我得到一个空白页面。我的控制台会记录所有内容,因此mongo的节点驱动程序正在处理文档。有任何想法吗?我觉得它与节点的异步性质有关。

var express = require('express');
var router = express.Router();

var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');
var url = 'mongodb://localhost:27017/YelpDB';

var getReviews = function(db, callback) {
  var cursor = db.collection('reviews').find( );
  //JSONArray jsonarray = new JSONArray();
  var data = [];
  cursor.each(function(err, doc) {
    assert.equal(err, null);
    if (doc != null) {
      var jsonDoc = JSON.stringify(doc);
      console.log(typeof jsonDoc);
      data.push(jsonDoc);
    } else {
      callback();
    }
  });
  return data;
};

router.get('/reviews/', function(req, res, next) {
  //res.send('respond with a resource');
  MongoClient.connect(url, function(err, db) {
    assert.equal(null, err);
    var data = getReviews(db, function() {
      db.close();
    });
    res.json({"reviews": data});
  });
});

1 个答案:

答案 0 :(得分:2)

请尝试此操作,您应该在data函数的cursor.each末尾返回callback

var getReviews = function(db, callback) {
  var cursor = db.collection('reviews').find( );
  var data = [];
  cursor.each(function(err, doc) {
    if (err)
        callback(err);

    if (doc) {
      var jsonDoc = JSON.stringify(doc);
      console.log(typeof jsonDoc);
      data.push(jsonDoc);
    } else {
      // at the end of cursor, return the data through callback 
      callback(null, data);
    }
  });
};

router.get('/reviews/', function(req, res, next) {
  //res.send('respond with a resource');
  MongoClient.connect(url, function(err, db) {
    assert.equal(null, err);
    getReviews(db, function(err, data) {
        if (err)
           throw err;

        // send the data in callback function
        res.json({"reviews": data});
        db.close();
    });
  });
});