MySQL и сокет взаимодействия в node.js - PullRequest
0 голосов
/ 03 июня 2019

Я пишу простую онлайн-видеоигру с узлом js и хочу управлять счетом каждого игрока, сохраняя ее в базе данных (mysql).

Теперь на стороне сервера у меня есть такой код:

    socket.on('game_over',function(data){
        for (var i = 0; i < players.length; i++) {
            if(players[i].id == data.id){
                var sql;    
                sql='UPDATE login SET email=? WHERE username=?'
                connection.query(sql, [data.score,"d"],function(error, results, fields) {
                    console.log(sql);
                    console.log(error);
                if (error) throw error;
                console.log(result);
            });
                players.splice(i,1);
                break;
            }
        }
        socket.broadcast.emit('p_disconnect',data.id);

    });

Когда я запускаю свой сервер и получаю сигнал game_over, мой сервер отключается. Печать sql-запроса верна, и я не вижу ошибок, так как он возвращает мне 'null'

Почему мой сервер отключается после этого и, что более важно, что я могу сделать, чтобы сервер работал?

Без части connection.query работает как надо

1 Ответ

0 голосов
/ 04 июня 2019

На основании комментария к вопросу:

// assuming 
const players = [
  {id: 1, otherInfo: 'foobar' },
  {id: 2, otherInfo: 'foobar' },
]

const connection = mysql.connect() // something like this

// When the game ends we assume that the game_over event is fired
socket.on('game_over',function (data) {

    // "I need to find the correct player"
    const correctPlayer = players.find(player => player.id === data.id)

    // "and delete it from the list of the active players"
    const position = players.indexOf(correctPlayer)
    players.splice(position, 1)

    // "and update the database with it's score" => depends on your DB structure
    const query = `UPDATE youTable SET score = ${data.score} WHERE playerId = ${correctPlayer.id}`


    // here depends on how you want to manage the query result (some examples)


    // run query (is async cause how js works) and just log the result
    connection.query(sql, function(error, results, fields) {
      // this code is executed when the query ends
      console.log(error, results, fields)
    }
    // this code is executed after starting the query
    socket.broadcast.emit('p_disconnect', data.id);


    // run query and emit event after the query ends
    connection.query(sql, function(error, results, fields) {
      socket.broadcast.emit('p_disconnect', data.id);
      console.log(error, results, fields)
    }
});
...