使用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);
。
你说得对, 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时才能读取任何内容。 我没有读太多的错误,但看看是否清除东西。