【发布时间】:2018-11-25 03:17:51
【问题描述】:
我正在开发基于 socket.io room 的项目。我将 socket 与 nodejs 一起使用并在 mongoDB 中管理房间数据。
这是我的代码,只有两个玩家可以加入一个房间,然后我将 IsGameOn 标志设置为 false 为 true。
当我一一向服务器发送请求时,此代码工作正常。
当一次有多个请求时会出现问题。问题是超过 2 个玩家加入房间(房间玩家的数据存储在一个玩家数组中)。
我还上传了数据库的图像。因此,您可以看到数据库中实际发生的情况。
const joinRoom = async (sData, callback) => {
if(sData.iPlayerId && sData.eRoomCount)
{
try {
let body = _.pick(sData, ['eRoomCount', 'iPlayerId']);
console.log(body);
await roomsModel.aggregate([
{
$match: {
eRoomCount: body.eRoomCount,
IsGameOn: { $eq: false }
}
},
{ $unwind: "$aPlayers" },
{
$group: {
_id: "$_id",
eRoomCount: { $first: "$eRoomCount" },
aPlayers: { $push: "$aPlayers" },
size: { $sum: 1 }
}
},
{
$match: {
size: { '$lt': body.eRoomCount }
}
},
{ $sort: { size: -1 } }
]).exec((error, data) => {
if (data.length < 1) {
let params = {
eRoomCount: body.eRoomCount,
aPlayers: [{
iPlayerId: body.iPlayerId
}]
}
let newRoom = new roomsModel(params);
console.log(JSON.stringify(newRoom));
newRoom.save().then((room) => {
console.log("succ", room);
callback(null,room);
}).catch((e) => {
callback(e,null);
});
} else {
roomsModel.findOne({ _id: data[0]._id }, (error, room) => {
if (error) {
callback(error,null);
}
if (!room) {
console.log("No room found");
callback("No room found",null);
}
room.aPlayers.push({ iPlayerId: body.iPlayerId });
if (room.aPlayers.length === room.eRoomCount) {
room.IsGameOn = true;
}
room.save().then((room) => {
callback(null,room);
}).catch((e) => {
callback(e,null);
});
})
}
});
} catch (e) {
console.log(`Error :: ${e}`);
let err = `Error :: ${e}`;
callback(e,null);
}
}
}
【问题讨论】:
-
如何访问 MongoDB?你在用猫鼬吗?
-
是的,我正在使用猫鼬。
-
旁注,像这样混合promise、callbacks和await/async,势必会导致后期维护混乱。