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

我正在编写一个使用 express、Node.js 和 MongoDB(使用 mongojs)的应用程序。我有一个模块 db.jsserver.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); .

最佳答案

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

https://stackoverflow.com/questions/23642510/

相关文章:

ruby-on-rails - 通过 AWS opsworks 设置 mongodb

java - Spring数据mongodb审计不起作用..(Java配置)

node.js - 在 docker 容器中安装 Mongoose

mongodb - 为什么 Spring Data MongoDB 无法实例化这种嵌套类型结构?

java - 仅为一个字段编写 Mongo 转换器

mongodb - 为什么 MongoDB 可以创建唯一索引而 Mongoid 不能?

mongodb - 如何将 MongoDB 聚合用于通用集合操作(​​联合、交集、差异)

php - 如何在 Waterline 或 MongoDB 中选择、分组和加入

mongodb - 复合索引可以服务多个查询吗

python - Pymongo 或 Mongodb 将两个相等的 python 字典视为不同的对象