Javascript对象在通过Socket.io时会丢失其函数
我正在尝试使用Socket.io和(一个实现一些加密算法的npm包)构建一个带有Node.js的加密webchat 我的问题是,每当我发送加密消息(出于某种原因,它是一个对象)时,它就会丢失解密另一端消息所需的所有函数,我的加密/解密代码如下: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
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可以处理的类型。