如何在Node.js中从MongoDB返回JSON?

我有一个叫做pokemon的mongodb数据库,里面有一个名为pokemon的集合。 这里是我尝试编写一个函数,它将在mongodb中执行find()操作:

 'use strict'; var MongoClient = require('mongodb').MongoClient; var assert = require('assert'); // db url var url = 'mongodb://localhost:27017/pokemon'; exports.getPokemonByName = function (name) { MongoClient.connect(url, function(err, db) { assert.equal(null, err); var cursor = db.collection('pokemons').find({name: name}); // how to return json? }); }; 

然后我在另一个文件中调用这个函数:

 var express = require('express'); var router = express.Router(); router.get('/pokedex', function (req, res) { res.jsonp(db.getPokemonByName('Dratini')); }) 

这个链接有助于展示如何通过在游标对象上执行某种each()方法来将mongodb数据logging到控制台,但是我不知道如何通过getPokemonByName函数return json。 我尝试在getPokemonByName函数的根作用域上定义一个空数组,并将每个迭代中的.each方法显示在该数组中,并将数据推送到该数组中,但是我认为仍然无法返回该数组,因为它发生在事实。

顺便说一句,我真的只是为了好玩而学习MongoDB和Node.js,所以我不想使用像Mongoose这样的ODM来为我做这些工作。

谢谢你的帮助!

编辑

只是好奇,对于那些正在阅读这篇文章的人来说,为什么这个问题会被压低? 是否因为答案可以从其他类似的问题或其他问题中获得?

谢谢!

我能够在节点的本地monogodb驱动程序github页面的帮助下回答我的问题: 请参阅此处。

实质上,我所做的只是在MongoClient的连接函数中定义我的导出函数。 出于某种原因,我认为节点出口必须在模块的根源,但事实并非如此。 这是一个完成的版本:

 'use strict'; var MongoClient = require('mongodb').MongoClient; var assert = require('assert'); // db url var url = 'mongodb://localhost:27017/pokemon'; var findDocuments = function(db, callback) { // Get the documents collection var collection = db.collection('pokemons'); // Find some documents collection.find({name: 'Dratini'}).toArray(function(err, docs) { assert.equal(err, null); // assert.equal(2, docs.length); console.log("Found the following records"); callback(docs); }); } // Use connect method to connect to the Server MongoClient.connect(url, function(err, db) { assert.equal(null, err); console.log("Connected correctly to server"); findDocuments(db, function(docs) { console.log(docs); exports.getPokemonByName = function() { return docs; } db.close(); }); }); 

然后在另一个文件中:

 var express = require('express'); var router = express.Router(); router.get('/pokedex', function (req, res) { res.jsonp(db.getPokemonByName()); }); 

当然,这个解决scheme要求我硬编码查询,但是现在我没问题。 当我来的时候会穿过那座桥。

这可能有帮助

 var cursor = db.collection('pokemons').find({name:name}).toArray(function(err,arr){ return arr; }); 

你可以使用find函数的callback来返回json。 尝试

 exports.getPokemonByName = function (name,callback) { MongoClient.connect(url, function(err, db) { assert.equal(null, err); var cursor = db.collection('pokemons').find({name: name},function(err,result){ if(err) { callback(err,null); } if(result) callback(null,result); }); }); }; router.get('/pokedex', function (req, res) { db.getPokemonByName('Dratini',function(err,result){ if(result) { res.jsonp(result); } }); })