【问题标题】:.push() not adding MongoDB objects to array.push() 不将 MongoDB 对象添加到数组
【发布时间】:2016-03-18 15:27:58
【问题描述】:

我已经设置了 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});
  });
});

【问题讨论】:

    标签: node.js mongodb asynchronous


    【解决方案1】:

    请试试这个,你应该在callback函数中返回cursor.each末尾的data

    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();
        });
      });
    });
    

    【讨论】:

    • 成功了!谢谢 :) 你的代码逻辑比我的好。
    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 2016-11-10
    • 2021-11-06
    • 2014-01-18
    • 1970-01-01
    • 2021-08-30
    • 2022-01-13
    相关资源
    最近更新 更多