我正在使用带有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
中传递的新用户?
答案 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});
})
}
});
});