Jquery Socket.io函数只工作一次,然后停止

Jquery Socket.io函数只工作一次,然后停止,jquery,node.js,socket.io,Jquery,Node.js,Socket.io,所以。。。出于某种原因,我决定完全采用socket.io服务器端处理,而不是使用route post。然而,我遇到了函数只工作一次的问题。第二次,一切都很好,除了数据库不更新。(背景中可能有其他错误,但我似乎找不到)。。。哦而客户端值发出总是只发出1,不会得到2、3、4等 客户端发射: $('#battle-wrapper').on('click', 'button#battlebutton', function (event) { event.preventDefault();

所以。。。出于某种原因,我决定完全采用socket.io服务器端处理,而不是使用route post。然而,我遇到了函数只工作一次的问题。第二次,一切都很好,除了数据库不更新。(背景中可能有其他错误,但我似乎找不到)。。。哦而客户端值发出总是只发出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');
}

});
socket.on('fight mob',函数(){
var session=socket.handshake.session;
//玩家变量
var userMhp=session.userdata.tough;
var-userHp=10;
var userDmg=session.userdata.str;
var userDef=session.userdata.tough;
//Mob变量
var-mobid=1;
var mobMhp=数学楼层(mobid*50);
var-mobHp=100;
var-mobDmg=5;
var-mobDef=5;
//统计变量
var-dmgdeltmob=0;
var dmgdeltuser=0;
var=0;
//弦
//var userVictory='';
//var mobVictory=“”;
//var userfault='';
//var mobfault='';
//转向变量
var userTurn=true;
//开始战斗循环
while(userHp>0&&mobHp>0){
//开战
如果(userTurn==true){
dmgdeltmob=userDmg;
//mobHp=mobHp-dmgdeltmob;
轮数+=1;
userTurn=false;
}else if(userTurn==false){
dmgdeltuser=mobDmg;
userHp=userHp-10;
轮数+=1;
userTurn=true;
}
}
//开始战斗结束计算

如果(userHp我找到了一个答案,可能不是最好的解决方案,实际上可能不是。但我做的是,我创建了一个会话处理程序函数,在登录和刷新时调用该函数:

 function sessionHandler() {
    // Adding the logged in user to session
    var userId = session.passport.user;
    var sql = 'SELECT * FROM users WHERE id = ?';
    var query = db.query(sql, userId, function (err, rows) {
      session.userdata = rows[0];
      session.save();
      var dataObj = session.userdata;
      socket.emit('start up', dataObj);
      usersConnected++;
      io.emit('users online', usersConnected);
      console.log(usersConnected);
    });
  }
这里是一个处理登录/刷新的基本逻辑。很遗憾,我需要将所有逻辑添加到函数本身中。因为所有返回的都是函数外部的未定义,但在同一块中

// User logs in
  if (session.passport === undefined) {
    socket.emit('not logged', destination);
  } else {
    if (session.userdata === undefined) {
      sessionHandler();

      // console.log(session.userdata.username + ' logged in');
    } else {
      if (session.userdata) {
        delete session.userdata;
        session.save();
        sessionHandler();
      }

      // console.log(session.userdata.username + ' refreshed their session');
    }
  }

但是,客户端的日志记录又如何呢?是否每次都进行日志记录?所有的
控制台.日志(…)
都按预期工作。数据库不会更新(这意味着
.emit(…)
在第一次刷新后也不会显示更新的数量。此外,如果我刷新并再次刷新,它仍然不起作用,并且会在我的game.ejs文件(其中列出了暴徒)中抛出未定义变量的错误。我不确定是什么原因导致了这种情况,也许我必须使用ajax post,但我也不确定在使用socket emit时如何使用它。好的,所以我已经找出了原因。这是会话。它没有更新会话值。我在
let post=…之后添加了一行
session.userdata.silver=post.silver;
。。.
。它会更新。但是,如果我刷新并再次运行该函数,它会将数据库重置为我第一次对其进行rand之前的状态。