所以我一直在用Javascript编写Twitch聊天机器人,并使用MongoDB存储有关用户的信息。有一个迷你游戏,在几次“攻击”后,怪物可以被击败,并且用户将从战斗中获得XP。在当前的战斗中有一系列用户被授予,以及被击败的用户列表。他们仍然得到XP,但他们的“胜利”没有更新。问题是我正在使用for循环,直到它更新了数组中的每个用户。这是有效的,但是非常错误,我认为这是因为函数在数据库有机会赶上之前循环(不确定是否是这种情况,但这是我的假设)。基本上,当数据库尝试更新用户时,它有时会多次更新同一个人,而不会更新其他人。
任何想法是什么导致它,如果我的假设听起来正确,我怎么能避免这种情况?
for (var i = 0; i < arenaConfig.users.length; i++) { // Game was won! Adding XP to every user instead of 1 user.
var currentUserI = arenaConfig.users[i];
globalLog("info", "Game was won, looping to add XP and restore users. Current user: " + currentUserI, channel);
searchUser(currentUserI, channel.substr(1), function (dataReturned) {
if (dataReturned == "new" || dataReturned == "err") { }
else {
updateUserHealthdb(db, currentUserI, dataReturned.stats.health, function () {
setTimeout(function () {
// Restored health to user.
updateXP(xpToAdd, currentUserI, function () {
if (arenaConfig.deadUsers.indexOf(currentUserI) >= 0) { // User was defeated
globalLog("info", "User was defeated by the boss, skipping updateWin function. - " + currentUserI, channel);
}
else {
globalLog("info", "User '" + currentUserI + "' was not defeated by the boss, incrementing win count", channel);
setTimeout(function () {
updateWin(1, currentUserI, function () {
});
}, 1000);
}
});
globalLog("success", "Successfully restored user's health to: " + dataReturned.stats.health, channel);
}, 1000);
});
}
});
globalLog("info", "Finished updating user " + i + "/" + arenaConfig.users.length + "(" + currentUserI + ")", channel);
}
因为你可以看到它只是更新一些人。我将发布For循环代码,以及更新统计数据的其中一个函数(我知道我的代码根本不高效,可能不必要很长,但我现在只是确保它的功能):
function updateXP(num, user, callback) {
dbuser.findOne({ 'name': user }, 'name stats.xp', function (err, person) {
if (person != null) {
person.stats.xp = person.stats.xp + num;
person.save();
globalLog("info", 'update: ' + person.name + ' [' + person.stats.xp + ' ' + "XP" + ' ]');
callback();
}
});
};
以下是更新数据库中统计信息的函数(所有更新函数都有类似的代码,只针对不同的数据库字段进行了调整)
{{1}}
非常感谢任何帮助,
麦克
答案 0 :(得分:0)
您的代码是否曾进入此区块?如果出现错误,您的代码将无声地失败。
vector
此外,您是否有一个MongoDB服务器或群集?如果它是群集的,则读取是&#34;最终是一致的&#34;。因此,如果您将用户写入主服务器,则辅助副本将最终&#34;给你你写的数据。