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

12

我正在编写一个应用程序,其中使用了 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响应而不将响应对象发送到我的DB模块?

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

2个回答

6
你说得对,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);
            }
        });
    });

3

我看到的两个总体问题:

首先,你的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 调用是异步的,因为在数据库调用返回其回调之前,您无法读取任何内容。不过我没有太多地阅读错误信息...看看能否解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接