用猫鼬检索数据

时间:2014-02-17 22:32:23

标签: node.js mongodb mongoose

我目前正在尝试使用Mongoose的用户,但是当我尝试将该功能移动到一个单独的模块时,它会抛出一些不太有用的错误。所以一些介绍:

如果我在控制器中使用这样的话:

exports.index2 = function(req, res) {
Users.find(function(err, users){
    if (err){
        console.log("ERR");
    }
    console.log(users);
    res.json(users);
});};

一切都很好,但是当我试图将它分开时,它就不起作用了。

exports.index = function(req, res) {  
   UsersModel.findAll(function(users, err){
        if (!err){
            console.log(users);  <--- this is not showing
            res.send(users);
        }else
            console.log(err);
   });
};

//这是在模型中,这在Controller

中是必需的
findAll: function() {
    User.find(function(err, users){
        if (err){
            console.log("ERR");
        }
        //console.log(users);  <--- this is showing
        return users;
    });
},

我未定义,因为我试图运行findAll同步而不是异步。在“照顾”这个之后,未定义消失了,但它仍然不起作用。

1 个答案:

答案 0 :(得分:1)

首先,您将回调函数传递给findAll()函数...

UsersModel.findAll(function(users, err){ ... })

...但findAll()方法从不使用此回调来返回任何值。根据它的使用方式,可以预期更多地按照以下方式定义:

findAll: function(callback) {
    User.find(function(err, users){
        callback(err, users);
    });
}

此外,您在第二个示例中的分支是这样的,即路径中永远不会发送响应:

exports.index = function(req, res) {  
    UsersModel.findAll(function(users, err){
        if (!err){
            console.log(users);  <--- this is not showing
            res.send(users);
        }else
            console.log(err);
   });
};

与第一个示例不同,函数仅调用res.send是在成功案例中进行的。因此,如果出现错误,您正在记录它,然后该函数退出,并且客户端永远不会发送响应(至少不会被此处理程序发送)。

基本上,您遇到的问题是管理回调。如果您感兴趣的话,这里是JavaScript回调模式的a good resource

干杯。