Javascript 在node.js上以字符串形式发送的数组

Javascript 在node.js上以字符串形式发送的数组,javascript,node.js,canvas,socket.io,Javascript,Node.js,Canvas,Socket.io,我正在用socket.io做一些实验。我有一个画布,它成功地将数据发送到服务器,服务器可以很好地接收数据 它接收到一个正确的Uint8ClampedArray,因为这就是正在发送的内容 当我从服务器向客户端发送此消息时,我得到一个字符串:[object]。我又查过了! 如果我遗漏了什么,服务器的代码如下: var fs, http, io, server; fs = require('fs'); http = require('http'); server = http.createServer

我正在用socket.io做一些实验。我有一个画布,它成功地将数据发送到服务器,服务器可以很好地接收数据

它接收到一个正确的Uint8ClampedArray,因为这就是正在发送的内容

当我从服务器向客户端发送此消息时,我得到一个字符串:[object]。我又查过了! 如果我遗漏了什么,服务器的代码如下:

var fs, http, io, server;
fs = require('fs');
http = require('http');
server = http.createServer(function(req, res) {
    return fs.readFile("" + __dirname + "/front.html", function(err, data) {
        res.writeHead(200, {
            'Content-Type': 'text/html'
        });
        return res.end(data, 'utf8');
    });
});
server.listen(1337);
io = require('socket.io').listen(server);
io.sockets.on('connection', function(socket) {
    socket.on('publish', function(message) {
         return io.sockets.send(message);
    });
});
在客户端:

var dataStr = JSON.stringify(data); // converts object to string
在服务器上:

var dataObj = JSON.parse(data); // converts string to object
在客户端:

var dataStr = JSON.stringify(data); // converts object to string
在服务器上:

var dataObj = JSON.parse(data); // converts string to object

唯一的方法是在客户端大小中重用
uint8clampedaray
。如果您的服务器端有这个

var x = new Uint8ClampedArray(3);
x[0] = -17;
x[1] = 93;
x[2] = 350;
var dataThatWillBeSent = JSON.stringify(x);
// '{"0":0,"1":93,"2":255,"length":3,"byteLength":3,"byteOffset":0,"buffer":{"byteLength":3}}'
在客户端,假设您已经包括了
uint8clampedaray
,您可以这样做

var dataReceived = '{"0":0,"1":93,"2":255,"length":3,"byteLength":3,"byteOffset":0,"buffer":{"byteLength":3}}';
dataReceived = JSON.parse(dataReceived);
// reconstruct Uint8ClampedArray object

我以前没有使用过
uint8clampedaray
,因此我不知道如何从JSON数据中恢复
uint8clampedaray
对象,但是如果您阅读文档,您可能会发现一些问题

唯一的方法是在客户端大小中重用
uint8clampedaray
。如果您的服务器端有这个

var x = new Uint8ClampedArray(3);
x[0] = -17;
x[1] = 93;
x[2] = 350;
var dataThatWillBeSent = JSON.stringify(x);
// '{"0":0,"1":93,"2":255,"length":3,"byteLength":3,"byteOffset":0,"buffer":{"byteLength":3}}'
在客户端,假设您已经包括了
uint8clampedaray
,您可以这样做

var dataReceived = '{"0":0,"1":93,"2":255,"length":3,"byteLength":3,"byteOffset":0,"buffer":{"byteLength":3}}';
dataReceived = JSON.parse(dataReceived);
// reconstruct Uint8ClampedArray object


我以前没有使用过
uint8clampedaray
,因此我不知道如何从JSON数据恢复
uint8clampedaray
对象,但是如果您阅读了该文档,您可能会发现一些问题

在发送之前是否尝试序列化数据-JSON.stringify?将此数组转换为字符串或使用post发送数据啊谢谢!JSON.stringify发送数据!只需要找出如何转换回来!要转换回-JSON.parse(),谢谢,我如何将其转换回Uint8ClampedArray,这是Canvas似乎接受的所有内容。在发送-JSON.stringify之前是否尝试序列化数据?将此数组转换为字符串或使用post发送数据啊,谢谢!JSON.stringify发送数据!只需要找出如何转换回来!要转换回-JSON.parse(),谢谢,我如何将其转换回Uint8ClampedArray,这是Canvas似乎接受的所有内容。当客户端接收数据时,我必须在客户端上执行JSON.parse,因为当我在服务器上执行此操作时,我遇到了与前面相同的问题。JSON.parse将把字符串转换回数组,这样您就可以在需要这种转换的任何地方使用。服务器将始终返回字符串,因此您需要使用我提到的这两个选项对其进行解析。JSON.parse在后面使用eval,因此我更喜欢使用eval.Waqar,抱歉,eval存在安全风险。为了回应Christoph的愤怒,运行
eval('client submitted data')
相当于说,“嘿,在我的服务器上运行你想要的任何代码。”这会打开你可以想象到的每个安全漏洞。别这样!在那种情况下你是对的。。。这只是一个转换的问题。出于安全考虑,我只会使用JSON.parse。当客户端接收数据时,我必须在客户端执行JSON.parse,因为当我在服务器上执行此操作时,我会遇到与以前相同的问题。JSON.parse将字符串转换回数组,以便您可以在需要这种转换的任何地方使用。服务器将始终返回字符串,因此您需要使用我提到的这两个选项对其进行解析。JSON.parse在后面使用eval,因此我更喜欢使用eval.Waqar,抱歉,eval存在安全风险。为了回应Christoph的愤怒,运行
eval('client submitted data')
相当于说,“嘿,在我的服务器上运行你想要的任何代码。”这会打开你可以想象到的每个安全漏洞。别这样!在那种情况下你是对的。。。这只是一个转换的问题。出于安全考虑,我只使用JSON.parse