使用node和socket.io运行自定义函数

时间:2013-07-06 01:12:22

标签: javascript node.js socket.io

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

//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是否从参数中删除函数?

2 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:0)

我不知道我是否帮助你,但据我所知,你有两种选择。

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

  2. 创建可调用函数的索引,并使用索引标识函数 在另一边。

  3. 示例:

    //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”是否符合您的要求。

    祝你好运:)