将mongodb中的所有模型作为对象或数组返回?

时间:2014-03-21 21:51:09

标签: javascript node.js mongodb

我正在使用带有mongodb的套接字,对于尝试创建新名称的用户,我需要检查数据库中的所有模型以查看它是否存在。

我做错了,基本上我正在尝试这样做。

var allUsers = [];

models.Message.find({}, function(err, data) {
    for(var i=0; i < data.length; i++) {
        allUsers.push(data[i].username);
    }
});

console.log(allUsers)

我坐在这里挣扎着让allUsers退出这个功能,我认为这甚至不是最好的方法。使用allUsers我只是要查看数组中是否存在新用户名。

所以进一步扩展我在这里做的是一些socket.io代码。如果我能让allUsers工作,我将会运行这样的验证。

socket.on('new user', function (data, callback) {

    if(data in allUsers) {
        callback(false);
    } else {
        callback(true);
        socket.userName = data;
        socket.connected = true;
        users[socket.userName] = socket;
        io.sockets.emit('user name', {usernames: users[socket.userName].userName, connected: users[socket.userName].connected});
    }

});

但没有它的工作,这是不好的。所以我的问题是我提供的内容(socket.io,mongodb)如何获取所有模型并验证数据库中是否存在data中传递的新用户?

1 个答案:

答案 0 :(得分:1)

models.Message.find是异步的,异步操作的结果仅在异步操作完成时可用。所以console.log(allUsers)将始终产生一个空数组。

应该是(伪js代码):

socket.on('new user', function (data, callback) {

    models.User.findOne({username:data.username},function(err,user){
        if(err){/*deal with error here */}
        else if(user){/*username already taken 
            respond with appropriate socket message here */
                socket.emit('user name already taken',{somemessage});
        }
        else{/* user with username not found */
            /*create new user into database then emit socket message */
            var user = new models.User(data);
            user.save(function(err,user){
                socket.emit('user name',{somemessage});
            })
        }
    });
});