1

所以我希望能够使用节点通过socket.io运行自定义函数我的基本想法很简单,我只是无法让它工作。一般来说,你会写一些类似的东西来对传入的消息运行一个函数......

//server
socket.on('incomingMessage', function(data) {
    console.log(data);
    io.sockets.emit('newMessage', {id: data.id, from: data.name, message: data.message});
});
//client
socket.on('newMessage', function(data) {
    $('#messages').html($('#messages').html() + data.message);
    $('#from').html($('#from').html() + data.from);
});

但我想做的是让它变得更加动态,并实际传递我想在消息本身中运行的函数,所以像这样......

//server
socket.on('customFunction', function(data) {
    console.log(data);
    io.sockets.emit('runFunction', data);
})

//client
socket.on('runFunction', function(data) {
    for(var index in data) {
        args.push(data[index]);
    }
    data.fn.apply(this, args);
});

但是当我使用类似的东西从客户那里打电话时......

socket.emit('customFunction', {id: sessionId, name: user.name, callBack: function() { alert('it worked');
    }
});

在服务器上,它记录的唯一内容是会话 ID 和名称,callBack(无论名称如何,我都尝试过 func、run、cb、callBack、customFunc)就消失了。所以我有点不知所措。有人有想法么?提前感谢您的帮助。我不知道为什么,但是当调用它时,它只记录会话 id 和名称元素、回调或 fn 或其他任何东西,只是不存在。node 或 socket.io 是否在发送内容时从参数中删除函数?

4

2 回答 2

0

您正在将数据转换为数组,然后尝试调用它不再具有的属性,然后将数据应用于 socket.on 函数(this

所以尝试类似:

socket.on('runFunction', function(data) {
    var arg = [];
    args.push(data.id);
    args.push(data.name);
    // etc...
    data.callback.apply(this, args);
});
于 2013-07-06T01:32:10.753 回答
0

我不知道我是否正确,但据我所知,您有两种选择。

  1. 将您的函数转换为字符串,您可以使用 toString() 或 toSource() 在另一端(节点或客户端)对其进行评估。但也许并且希望您不希望这样:) - 重要的是,如果您使用 JSON.stringify 或任何框架解决方案来执行此操作,则该函数未序列化。

  2. 创建可调用函数的索引并使用该索引来标识另一侧的函数。

例子:

//create a index on one side
var runtime = {
"addMessage":function(param1,param2){  alert(arguments)   },
"whatEverFunction":function(){}
 }

 socket.on("runtime",function(data){
 if(!runtime[data.fn])return alert("runtime error");
 runtime[data.fn].apply(null,data.args);
 }


//create a call on the other
socket.io.emit({fn:"addMessage",args:["paramAValue","paramBValue"]});

如果这对您没有帮助,您可能需要检查库“dnode”是否符合您的要求。

祝你好运 :)

于 2013-07-06T06:24:45.227 回答