Node.js , WebSocket, запретить пользователю изменять неправильные данные

#javascript #node.js

#javascript #node.js

Вопрос:

РЕДАКТИРОВАТЬ: на самом деле я точно не уверен, имеет ли Nodejs свою собственную систему разделения данных, чтобы предотвратить возникновение такой ошибки. Поэтому мне нужно, чтобы кто-нибудь ответил мне, если я ошибаюсь.. спасибо за ваше время.

Итак, я кодирую шахматную игру в реальном времени в браузере.

Мой сервер nodejs. (Я сократил это, чтобы уменьшить время чтения)

 const express = require('express');
const http = require('http');
const WebSocket = require('ws');

const port = 6969;
const server = http.createServer(express);
const wss = new WebSocket.Server({
    server
});

clients = [];
// That array contains the figure positions for all users connected.
// It is array that contains arrays. EXAMPLE:
// Each user has his own userid, username, and the figure position in each array:
// clients {
//   [0] = {'51', 'Diablo', '5'}
//   [1] = {'84', 'Jason', '3'}
//   [2] = {'15', 'Triston', '8'}
// }

// When user makes a move, a data is sent.
wss.on('connection', function connection(ws){
    ws.on('message', function incoming(data){
      // An user with ID 84, is sending his new figure position '13'.
      data = JSON.parse(data);
      // Now we need for loop in the clients array, to find the array index of the player
      // with ID of 84, in order to replace the old figure position in that index with
      // the new figure position.
      change_figure_position(data[0]);
    });
});

function change_figure_position(userid){
  var user_data;
  // looping trough all currently connected users.
  for (var i = 0; i < clients.length; i  ) {
    // Upon each loop, check if the array index of 0 (the user id) matches
    // with the id of the user that send data.
    if(clients[i][0].includes(userid) == true){
      // The user index is found! Change the figure position in that index.
      clients[i][2] = data[2];
    }
  }
}  

Приведенный выше код объясняет все это, поскольку я добавил комментарии повсюду. Код работает отлично, но моя проблема в другом. Насколько я знаю, Nodejs работает не так, как PHP. В PHP, когда пользователи продолжают выполнять код того же типа, PHP выполняет один запрос и не начинает выполнение другого, не завершив выполнение первого. Но в Nodejs все работает в режиме реального времени. Меня здесь беспокоит следующее. Поскольку Nodejs работает в режиме реального времени и не ожидает завершения первого запроса. Два пользователя могут отправлять данные одновременно.

Если пользователь отключается от моей игры, то его массив, содержащий его данные, удаляется из моей переменной clients. В этом случае номера индексов меняются. Что делать, если функция change_player_figure вызывается клиентом, в то время как другой клиент одновременно отключается? Произойдет следующее.

 #current status of the clients variable
clients {
 [0] = {'51', 'Diablo', '5'}
 [1] = {'84', 'Jason', '3'}
 [2] = {'15', 'Triston', '8'}
 [3] = {'16', 'Jimmie', '5'}
}

// user Triston moves a figure
// the function finds that his index is [2]

// an user called Jason disconnects AT THE SAME TIME Triston moves a figure
#current status of the clients variable
clients {
 [0] = {'51', 'Diablo', '5'}
 [1] = {'15', 'Triston', '8'}
 [2] = {'16', 'Jimmie', '5'}
}

// remember, Triston disconected before the function FULLY executed itself
// the function still remembers that Triston's index is [2], but now it is [1].
// so what will happen is that Jimmie's figure will be moved instead.  

Это был мой вопрос. Поскольку Nodejs работает в режиме реального времени, возможны ли подобные ошибки? К сожалению, я понятия не имею, как это проверить. С одной стороны, код работает, это не значит, что все в порядке. Я должен был задать этот вопрос. Я надеюсь, что кто-то с большим опытом сможет ответить мне или дать мне совет, что мне делать, если эта ошибка возможна. Спасибо за ваше время.

Комментарии:

1. каждый оператор javascript выполняется после завершения предыдущего — точно так же, как PHP … «реальное время» не является уместным термином … если у вас были какие-то асинхронные вызовы или что-то в этом роде, то это может быть проблемой, но .. похоже, в вашем коде нет ничего подобного — код в обработчике событий является асинхронным, но это не проблема, весь код будет выполнен до того, как можно будет обработать другое событие

2. Я провожу 1 день, задаваясь вопросом, прав я или нет в своих сомнениях, но я надеюсь, что вы правы. Я еще немного почитаю и продолжу делать то, что делаю. Спасибо за ваше время.