我正在编写一个应用程序,我使用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
作为回调传递给我的函数。
问题是:当我按照我认为正确的方式做事时,我面临以下错误:
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响应?
P.S。当我进行更改时,db.js
第36行的内容为callback(data);
。
答案 0 :(得分:5)
你是对的,db.js
不应该致电res
,甚至不应该知道它。保持分离是件好事。
在此之后(未经测试):
<强> 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);
}
});
});
答案 1 :(得分:2)
我看到两个总体问题:
首先,您的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调用是异步的,因为在数据库调用返回其回调之前,您无法读取任何内容。 我没有读过太多的错误。看看是否能彻底搞清楚。