2017-02-23 46 views
2

我从服务器端向客户端发送对象,并且客户端获得的对象与我发送的对象完全不同。这就是我的意思是:Socket IO客户端接收对象与服务器发送的内容不同


代码

服务器端代码:

//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 

我hav e双重三重四倍检查确认服务器正在使用正确的ID发送正确的对象当客户端获取对象时,对象不同并且有错误的ID!这怎么会发生?


其它

尝试:

  • 我试图复制res到一个新的对象,然后发送这一点,但也没有工作。就像这样:

    var newres = res; 
    socket.emit("updateRealSeatSelect", newres); 
    
  • 我使用JSON.parseJSON.stringify当我发送的对象,但是这并没有帮助也试过。就像这样:

    socket.emit("updateRealSeatSelect", JSON.stringify(res)); 
    

版本:

  • 快递版本:3.5.2
  • 节点版本:V6.5.0
  • Socket.IO:v1.3.6
+1

如果您不指定错误的值会发生什么? –

+0

@ PM77-1首先设置错误的值是显示socket io正在发送旧对象。在我的实际代码中,id被设置在其他地方,然后我替换该id并发送消息。所以我不能跳过这一步:(但是当我在服务器端输出对象时,这是正确的。我不知道为什么它在服务器端是正确的,而在客户端上是错误的。 – Kayvar

+0

我没有提出任何建议。我只是想知道没有事先分配会发生什么,您可以检查吗? –

回答

1

这是我认为真正的哈哈即使它没有在你的代码示例中演示过。

你的对象的ID看起来像UUID,这可能暗示了Cassandra。即使它不是Cassandra,也可能是某个数据库,因此该对象是异步检索的,但是在实际检索对象之前返回响应,并且还将该对象保留在全局变量或外部作用域中,该作用域在调用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); 

粗略地说。当然,这只是猜测,因为你没有提供一个让我们重现问题的例子,你也没有解释代码中最相关的部分。

如果您使用回调或承诺异步获取数据,请确保在实际拥有它之前不要尝试将其发送到套接字。

而且,总是使用:

'use strict'; 

在你的代码的开头,以确保您不会隐式声明的全局变量。

并阅读有关JavaScript中的并发 - 回调,延续传递样式,承诺,异步函数。

您可以用比传统的回调异步功能有更多的运气,并承诺处理,所以不是像这样使用回调:

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 
} 

哪些可能更清洁r遵循控制流程。

+0

感谢您的所有提示!!我想我现在可以让它工作:) – Kayvar

相关问题