Данные массива дублируются при передаче через сокет (Socket.io) - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть сервер NodeJS, который получает данные от Max / MSP (с модулем Max-api) с помощью сокетов Socket.io. Сообщения, включающие имя каталога файлов (который включает в себя изображения определенных c тактов, нот и текстов песен), темп песни (2, 4, 6 или 8, которые умножаются на 100 в клиенте Node и динамически добавлено к переменной темпа в функции setInterval для анимации изображений в слайд-шоу) и, наконец, сообщение о запуске и остановке для управления анимацией слайдов в браузере.

Моя проблема заключается в том, что при попытке очистить изображения с экрана и запросить новую песню у Max / MSP (с соответствующими изображениями и темпом) массив переменных имени файла (которые добавляются к пути к файлу и используются как img sr c url's) удваиваются (или повторно добавляются), и продолжайте дублировать каждый раз, когда новый массив отправляется из Max. Единственный способ полностью очистить массив - это остановить соединение между Максом и Узлом и перезапустить его, при этом теряются все соединения с сокетами, требуется браузер refre sh и, по сути, перезапускается приложение.

Ниже приведен модуль Max-api, который служит клиентом socket.io и передает сообщения от Max / MSP на Node:

const imageArray = [];
const binaryDir = (path.join(__dirname, 'public', 'src/'));
var filePath; 
var basePath;

//FUNCTION TO SEND ARRAY AND REL FILE PATH TO SERVER.JS
function sendArray() {
    if (imageArray.length != 0) {
        socket.emit("imageArray", imageArray, basePath);
    } 
};

//FUNCTION TO LOAD FILES IN FILE PATH WITH DIR NAME PROVIDED BY MAX IN HANDLER (songName)
function load() {
        fs.readdir(filePath, (err, files) => {
            files.forEach( file => {
                imageArray.push(file);
            })
            console.log("FILES" + files)
            sendArray()
            console.error(err)
        });
};

// MAX HANDLER
maxApi.addHandler('filepath', (songName) => {
    filePath = path.join(binaryDir, songName)
    basePath = path.basename(filePath)
    load()
});

Данные imageArray и basePath принимаются в сервер и отправил прямо клиенту:

   socket.on("imageArray", (imagearray, basepath)=>{
         socket.broadcast.emit("images", imagearray, basepath );
         console.log('Server received images..', imagearray.length);
   });

Я не уверен, если это проблема socket.io. Я знаю, что проблема где-то в приведенном выше коде, когда я использую console.log('Server received images..', imagearray.length);, первый отправляемый массив «Сервер получил изображения .. 56», и когда я отправляю другой массив, он увеличивается до 112, затем 168 и так далее.

Я знаю, что проблема не в Максе, так как при входе в консоль Max с помощью maxApi.post(`Dir from node ${files}`) он каждый раз печатает только 56 файлов изображений в массиве.

Я попытался просто добавить imageArray.length = 0; до sendArray(), но безрезультатно.

1 Ответ

1 голос
/ 03 апреля 2020

Вы не сбрасываете imageArray, поэтому он сохраняет существующее значение, есть много способов сделать это, но я предпочитаю следующее:

const binaryDir = (path.join(__dirname, 'public', 'src/'));

var filePath; 
var basePath;

//FUNCTION TO SEND ARRAY AND REL FILE PATH TO SERVER.JS
function sendArray(myArray) {
    if (myArray.length != 0) {
        socket.emit("imageArray", myArray, basePath);
    } 
};

//FUNCTION TO LOAD FILES IN FILE PATH WITH DIR NAME PROVIDED BY MAX IN HANDLER (songName)
function load() {
        fs.readdir(filePath, (err, files) => {
            let myArray = [];
            files.forEach( file => {
                myArray.push(file);
            })
            console.log("FILES" + files)
            sendArray(myArray)
            console.error(err)
        });
};

// MAX HANDLER
maxApi.addHandler('filepath', (songName) => {
    filePath = path.join(binaryDir, songName)
    basePath = path.basename(filePath)
    load()
});
...