Javascript 通过套接字(socket.io)传输时复制的阵列数据

Javascript 通过套接字(socket.io)传输时复制的阵列数据,javascript,node.js,arrays,socket.io,max-msp-jitter,Javascript,Node.js,Arrays,Socket.io,Max Msp Jitter,我有一个NodeJS服务器,它使用Socket.iosockets从Max/MSP(带有Max api模块)接收数据。消息包括文件目录名(其中包括特定歌曲的条形图、音符和歌词的图像)、歌曲的节奏(2、4、6或8,在节点客户端中乘以100,并在setInterval函数中动态添加到节奏变量以在幻灯片中设置图像动画),最后是一条开始和停止消息,用于控制浏览器中的幻灯片动画 我的问题是,当我试图清除屏幕上的图像并从Max/MSP请求一首新歌(带有相应的图像和节奏)时,文件名变量数组(附加到文件路径并用

我有一个NodeJS服务器,它使用Socket.iosockets从Max/MSP(带有Max api模块)接收数据。消息包括文件目录名(其中包括特定歌曲的条形图、音符和歌词的图像)、歌曲的节奏(2、4、6或8,在节点客户端中乘以100,并在setInterval函数中动态添加到节奏变量以在幻灯片中设置图像动画),最后是一条开始和停止消息,用于控制浏览器中的幻灯片动画

我的问题是,当我试图清除屏幕上的图像并从Max/MSP请求一首新歌(带有相应的图像和节奏)时,文件名变量数组(附加到文件路径并用作img src url)会加倍(或重新添加),并在每次从Max发送新阵列时继续复制。完全清除阵列的唯一方法是停止Max和Node之间的连接并重新启动它,这会丢失所有套接字连接,需要刷新浏览器,并基本上重新启动应用程序

以下是用作socket.io客户端并将消息从Max/MSP传输到节点的Max api模块:

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')时,我知道问题在上面代码的某个地方,发送的第一个数组是“Server received images..56”,当我发送另一个数组时,它会增加到112,然后是168,依此类推

当我使用
maxApi.post(`Dir from node${files}`)
登录到Max控制台时,我知道问题不在Max上,它每次只打印数组中的56个图像文件


我尝试简单地添加
imageArray.length=0
sendArray()
但无效。

您没有重置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()
});