【发布时间】:2018-06-18 04:12:01
【问题描述】:
所以...出于某种原因,我决定完全采用 socket.io 服务器端处理,而不是路由发布。但是我遇到了一个函数只能工作一次的问题。第二次,一切都很好,除了数据库没有更新。 (后台可能有其他问题,但我似乎找不到)......哦!并且客户端发出的值只会发出 1,不会得到 2、3、4 等。
客户端发射:
$('#battle-wrapper').on('click', 'button#battlebutton', function (event) {
event.preventDefault();
socket.emit('fight mob', $('#mobs').val());
console.log($('#mobs').val());
});
Socket.io 代码:
socket.on('fight mob', function () {
var session = socket.handshake.session;
// Player Variables
var userMhp = session.userdata.tough;
var userHp = 10;
var userDmg = session.userdata.str;
var userDef = session.userdata.tough;
// Mob Variables
var mobid = 1;
var mobMhp = Math.floor(mobid * 50);
var mobHp = 100;
var mobDmg = 5;
var mobDef = 5;
// Statistic variables
var dmgdeltmob = 0;
var dmgdeltuser = 0;
var rounds = 0;
// Strings
// var userVictory = '';
// var mobVictory = '';
// var userDefeat = '';
// var mobDefeat = '';
// Turn Variables
var userTurn = true;
//start battle loop
while (userHp > 0 && mobHp > 0) {
// Start BATTLE
if (userTurn === true) {
dmgdeltmob = userDmg;
// mobHp = mobHp - dmgdeltmob;
rounds += 1;
userTurn = false;
} else if (userTurn === false) {
dmgdeltuser = mobDmg;
userHp = userHp - 10;
rounds += 1;
userTurn = true;
}
}
// Start end of battle Calculations
if (userHp <= 0) { // Defeat
console.log('Lost');
let sql = 'UPDATE users SET ? WHERE id = ?';
let post = {
silver: session.userdata.silver + 1,
};
db.query(sql, [post, session.userdata.id], function (err) {
console.log('1 Silver Success');
var data = post.silver;
socket.emit('mob test', data);
return;
});
} else {
console.log('Won');
}
});
【问题讨论】:
-
但是在客户端登录呢,是不是每次都登录?
-
所有
consoles.logs(...)都按预期工作。数据库没有更新(这意味着.emit(..)在第一次之后也没有显示更新的数量。另外,如果我刷新并再次执行它仍然不起作用,并且它会在我的内部引发未定义变量的错误game.ejs 文件(其中列出了小怪)。我不确定是什么原因造成的,也许我必须使用 ajax 帖子,但我不确定在使用套接字发射时如何使用它。 -
好的,我已经弄清楚是什么原因造成的。这是会话。它不会更新会话值。我在
let post = ...之后添加了一行session.userdata.silver = post.silver;。它会更新。但是,如果我再次刷新并运行该函数,它会将数据库重置为我第一次 rand 之前的状态。