使用express将MongoDB查询结果作为JSON发送

我正在写一个应用程序,我使用express,Node.js和MongoDB(使用mongojs)。 我有一个模块db.js和一个server.js ,下面有代码片断。

db.js

 var getUsersByCity = function(city, callback) { db.users.find({'city': city}).toArray(function(err, data) { if (err) { callback(err); console.log(err); } else { console.log(data); callback.json(data); } }); } 

server.js

 app.post("/get_users_list", function(req, res) { var body = req.body; db.getUsersByCity(body.city, res); }); 

这是工作,因为,你可以看到,我(可能不正确)使用callback.json(data) ,当我应该使用callback(data) 。 我认为db.js模块不应该负责发送响应,我应该通过res.json作为我的函数的callback。

问题是:当我按照我认为正确的方式做事情时,我面临着以下错误:

 path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/connection/base.js:245 throw message; ^ TypeError: Cannot call method 'get' of undefined at res.json (path_to_my_app/node_modules/express/lib/response.js:189:22) at path_to_my_app/db.js:36:13 at path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/cursor.js:163:16 at commandHandler (path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/cursor.js:706:16) at path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/db.js:1843:9 at Server.Base._callHandler (path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/connection/base.js:445:41) at path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/connection/server.js:468:18 at MongoReply.parseBody (path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5) at null.<anonymous> (path_to_my_app/node_modules/mongojs/node_modules/mongodb/lib/mongodb/connection/server.js:426:20) at EventEmitter.emit (events.js:95:17) 

如何正确发送JSON响应而不将响应对象发送到我的DB模块?

PS当我进行更改时, db.js的第36行的内容是callback(data);

       

网上收集的解决方案 "使用express将MongoDB查询结果作为JSON发送"

你说得对, db.js不应该调用res或者甚至不知道它。 保持分离是很好的。

在此之后(未经testing):

db.js

  var getUsersByCity = function(city, cb) { db.users.find({'city': city}).toArray(cb); } 

server.js

  app.post("/get_users_list", function(req, res) { var body = req.body; db.getUsersByCity(body.city, function(err, data){ if (err) { console.log(err); return res(err); } else { console.log(data); return res.json(data); } }); }); 

我看到两个总体问题:

首先,你的db.js文件应该是这样的:

 callback(err, data); 

其次,你的server.js调用应该看起来更像:

 db.getUsersByCity(body.city, function(err, data){ if(err){ res.send(500, "something went wrong"); }else{ res.json(data); } }); 

db.getUsersByCity调用是asynchronous的,因为直到数据库调用callbackcallback时才能读取任何内容。 我没有读太多的错误,但看看是否清除东西。