Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript对象在通过Socket.io时会丢失其函数_Javascript_Node.js_Encryption_Socket.io - Fatal编程技术网

Javascript对象在通过Socket.io时会丢失其函数

Javascript对象在通过Socket.io时会丢失其函数,javascript,node.js,encryption,socket.io,Javascript,Node.js,Encryption,Socket.io,我正在尝试使用Socket.io和(一个实现一些加密算法的npm包)构建一个带有Node.js的加密webchat 我的问题是,每当我发送加密消息(出于某种原因,它是一个对象)时,它就会丢失解密另一端消息所需的所有函数,我的加密/解密代码如下: function encrypt (bytesToEncrypt){ cipher = forge.cipher.createCipher('AES-CBC', key); cipher.start({'iv': iv}); ci

我正在尝试使用Socket.io和(一个实现一些加密算法的npm包)构建一个带有Node.js的加密webchat

我的问题是,每当我发送加密消息(出于某种原因,它是一个对象)时,它就会丢失解密另一端消息所需的所有函数,我的加密/解密代码如下:

function encrypt (bytesToEncrypt){
    cipher = forge.cipher.createCipher('AES-CBC', key);
    cipher.start({'iv': iv});
    cipher.update(forge.util.createBuffer(bytesToEncrypt));
    cipher.finish();
    var encrypted = cipher.output;
    console.log(encrypted.toHex());
    return encrypted
}

function decrypt (bytesToDecrypt){
    decipher = forge.cipher.createDecipher('AES-CBC', key);
    decipher.start({'iv': iv});
    decipher.update(bytesToDecrypt);
    var result = decipher.finish(); // check 'result' for true/false
    console.log('decryption result = ' + result);
    // outputs decrypted hex
    console.log(decipher.output.toString());
    return decipher.output.toString();
}
无论何时我尝试以这种方式发送邮件:

socket.emit('chat message', encrypt("Hello world"));
然后在另一边解密:

    socket.on('chat message', function(msg){
        decrypt(msg)
    });
我得到以下错误:

Uncaught TypeError: e.getBytes is not a function
at n.o.ByteStringBuffer.putBuffer (forge.min.js:1)
at a.cipher.BlockCipher.n.update (forge.min.js:8923)
at decrypt ((index):68)
因为每当通过socket.io发送对象时,它都会丢失其函数(在本例中为.getBytes())。 我想知道这个问题是否有解决办法,或者对我来说,最好的办法是重新开始,选择其他的方法

我还发布了一个链接到项目本身的要点(可能更容易理解)


正如@Thomas指出的,有必要在收到消息的同时创建一个新的ByteStringBuffer。因此,每当收到新消息时,应执行以下代码:

    socket.on('chat message', function(msg){
        var message = new forge.util.ByteStringBuffer(msg.data);
        console.log(message)
        decrypt(message)
    });

这将创建一个新的ByteStringBuffer对象,该对象具有解密所需的方法。

您是否检查了从socket.io中获得的对象?可能是javascript对象作为JSON编码字符串传递。在JSON规范中,它说你不能将函数放入JSON。是的@Thomas,我得到了一个与我发送的对象几乎相同的对象,但它以前拥有的函数除外,这些函数都丢失了。这似乎是因为函数似乎无法通过套接字发送。Io你尝试发送的对象不是常规的JS类型,与类型化数组或缓冲区类似,但是
forge
提供的类型显然socket.io不知道如何序列化/解析它,而只是作为常规的
对象。要解决此问题,请查看如何将该类型转换为socket.io可以处理的类型。