Socket IO Client接收对象与服务器发送的不同
我从我的服务器端发送一个对象到我的客户端,而客户端获得的对象与我发送的对象完全不同。 这是我的意思:
码
服务器端代码:
//Basic setup for the example var res={}; res.models=[]; res.models[0]={}; //The OLD (wrong) value res.models[0]['id']="b4fd12f1-61ca-4445-b916-62617f1c0a78"; //The NEW (correct) value res.models[0]['id']="fb8f83e2-e157-4e1e-8315-8e5f03b44691"; //Output what the id is, this is always the correct id! console.log("res.models[0]['id']: ",res.models[0]['id']); socket.emit("updateRealSeatSelect", res);
客户端代码:
socket.on("updateRealSeatSelect", function(data){ //Output the id when we get the object. This is always wrong! console.log("res.models[0]['id']: "+data.models[0]['id']); });
输出是问题。 这是我得到的:
产量
服务器端输出:(正确)
res.models[0]['id']: fb8f83e2-e157-4e1e-8315-8e5f03b44691
客户端输出:(错!为什么不一样?)
res.models[0]['id']: b4fd12f1-61ca-4445-b916-62617f1c0a78
我有双三重四重检查服务器发送正确的对象与正确的ID。 当客户端获得对象时,对象是不同的,并有错误的ID! 这怎么可能发生?
杂项
尝试:
-
我试图复制
res
到一个新的对象,然后发送,但也没有工作。 喜欢这个:var newres = res; socket.emit("updateRealSeatSelect", newres);
-
我也尝试使用
JSON.parse
和JSON.stringify
发送对象时,但这也没有帮助。 喜欢这个:socket.emit("updateRealSeatSelect", JSON.stringify(res));
版本:
- Express版本:3.5.2
- 节点版本:v6.5.0
- Socket.IO:v1.3.6
这是我认为真正发生的事情,即使它没有在你的代码示例中演示。
你的对象的ID看起来像UUID,这可能暗示了Cassandra。 即使它不是Cassandra,也可能是某个数据库,因此该对象是asynchronous检索的,但是在对象被实际检索之前返回响应,并且还将该对象保存在全局variables或外部作用域中, socket.emit()
。
我也希望重新启动服务器后的第一个socket.emit()
根本没有返回任何对象,所有后续的响应都会得到前一个响应。
所以这不是这样的:
//The OLD (wrong) value res.models[0]['id']="b4fd12f1-61ca-4445-b916-62617f1c0a78"; //The NEW (correct) value res.models[0]['id']="fb8f83e2-e157-4e1e-8315-8e5f03b44691"; socket.emit("updateRealSeatSelect", res);
但是更多的是这样的:
database.getObject(function (data, res) { if (err) { // handle error } else { res = data; } }); socket.emit("updateRealSeatSelect", res);
大致说来。 当然,这只是猜测,因为你没有提供一个让我们重现问题的例子,你也没有解释代码中最相关的部分。
如果您使用callback或承诺asynchronous获取数据,请确保在实际拥有之前不要尝试将其发送到套接字。
另外,总是使用:
'use strict';
在你的代码的开始,以确保你不隐式地声明全局variables。
并阅读有关JavaScript的并发 – callback,延续传递样式,承诺,asynchronous函数。
使用asynchronous函数可能会比传统的callback和承诺处理有更多的运气,所以不是像使用callback这样的东西:
getFromDatabase(function (err, data) { if (err) { // handle error } else { socket.emit('data', data); } });
或使用承诺这样的事情:
getFromDatabase().then(function (data) { socket.emit('data', data); }).catch(function (err) { // handle error });
你会写如下的东西:
try { socket.emit('data', await getFromDatabase()); } catch (err) { // handle error }
这可能更清楚地遵循控制stream程。