【问题标题】:Why does passing a KinectJS object from Client to NodeJS through a function cause loss of class?为什么通过函数将 KinectJS 对象从 Client 传递给 NodeJS 会导致类丢失?
【发布时间】:2012-02-29 21:27:40
【问题描述】:

我正在使用 KinectJS 创建一个 Kinect.Rect 对象。我正在尝试将此对象从客户端传递到服务器。在客户端(就在作为参数传递之前,控制台中对象的输出是:

box_284
Kinetic.Rect
alpha: 1
centerOffset: Object
className: "Shape"
drag: Object
drawFunc: function (){
eventListeners: Object
fill: "00D2FF"
height: 25
isListening: true
name: undefined
rotation: 0
scale: Object
stroke: "black"
strokeWidth: 4
visible: true
width: 25
x: 100
y: 100
__proto__: Object

发送后是:

box
Object
alpha: 1
centerOffset: Object
className: "Shape"
drag: Object
eventListeners: Object
fill: "00D2FF"
height: 25
isListening: true
rotation: 0
scale: Object
stroke: "black"
strokeWidth: 4
visible: true
width: 25
x: 100
y: 100
__proto__: Object

KinectJS 库可供客户端使用,这是“深度克隆”问题以及对象如何传递的问题吗?是否有库对服务器不可用的问题?不知道该怎么想……对 Javascript 来说相当新。

================

更新

我发送参数如下:

socket.emit('add_box', eval("box_" + id));

对象的位置类似于:box_523

【问题讨论】:

  • 如何发送? JSON 序列化不包含类信息。
  • 我用这些信息更新了我的问题。也许我应该尝试另一种方法来完成这个?

标签: javascript node.js


【解决方案1】:

首先,我建议您通过某种数组或字典访问您的对象,而不是使用eval("box_" + id)。撇开任何潜在的安全问题不谈,对数组进行索引将比eval 提供更好的性能。

要解决您问题的核心,问题是socket.emit 序列化和传输数据。由于drawFunc 是一个函数而不是数据,它不会被传输。

如果你仔细想想,这是相当直接的行为。如果您将一个函数移过网络,预期的行为会是什么?它会在哪里执行?您会传输实际的 JavaScript,然后在服务器上对其进行评估吗?

虽然这些都是您可以回答并开发自己的解决方案的问题,但这并不是任何地方都可以开箱即用的。


也就是说,您可能想查看function calling with nowjs。它可能符合您的要求。但同样,它不会通过网络传输任何代码:

注意:代码只会在创建它的那一侧执行, 这意味着函数的主体实际上并没有被转移 从客户端到服务器或服务器到客户端,而只是一个垫片 用于同步时的远程函数调用。这是巨大的 对安全很重要,因为这意味着永远不会有任意代码 在 NowJS 中执行

【讨论】:

  • 谢谢 Rohan,你能给我一个简单的例子,说明我如何使用数组或字典来完成 eval('box_' + id) 会做什么?
  • 我对 KinectJS 不熟悉,但这里是一般原则。初始化一个数组boxes = []。然后每次创建盒子时,请执行boxes.push[myNewBox]。然后,您应该能够使用例如box[123] 访问任何框。
猜你喜欢
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2015-05-10
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 2019-01-27
相关资源
最近更新 更多