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.parseJSON.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程。