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

Javascript 使用node和socket.io运行自定义函数,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,所以我希望能够使用node通过socket.io运行自定义函数 我的基本想法相当简单,我就是无法让它发挥作用。一般来说,您会编写类似的代码来对传入消息运行函数 //server socket.on('incomingMessage', function(data) { console.log(data); io.sockets.emit('newMessage', {id: data.id, from: data.name, message: data.message}); })

所以我希望能够使用node通过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和名称,回调(不管名称如何,我已经尝试过func、run、cb、callBack、customFunc)就消失了。所以我有点不知所措。有人有什么想法吗?提前谢谢你的帮助。我不知道为什么,但是当调用它时,它只记录会话id和name元素,回调,或fn,或其他任何东西,只是不存在。node或socket.io在发送内容时是否从参数中删除函数?

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

因此,请尝试以下方法:

socket.on('runFunction', function(data) {
    var arg = [];
    args.push(data.id);
    args.push(data.name);
    // etc...
    data.callback.apply(this, args);
});

我不知道我是否理解正确,但据我所知,你有两个选择

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

  • 创建可调用函数的索引,并使用该索引标识函数 在另一边

  • 例如:

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


    祝你好运:)

    没有这样的运气。我对代码进行了修改,这样客户机就只有socket.on('runFunction',function(data){data.fn.apply(this,data);}}),但当我调用它时,服务器只记录{“id”:“-sasf9akdn”},所以fn甚至无法到达服务器。不知何故,somwehere节点或套接字正在运行它,并从正在运行的数据中删除sentconsole.log(data),然后查看我在socket.on('customFunction')中的两个服务器上都做了什么('customFunction'…函数,当使用…socket.emit调用时,它只记录“{id:”fdsicnsdev4a“}”。'customFunction',{id:sessionId,fn:function(){alert('something');});客户端也记录了同样的事情,fn不是什么坏主意,我知道eval,这就是为什么我永远不会使用它:)。这里的主要思想是纯动态编码,最终目标是在对服务器的调用中编写我想要在服务器上运行的函数。这样,我就不必真正地更新服务器上的代码来添加新功能,我可以动态地编写需要运行的函数,并将其发送到服务器上以在服务器上执行。我意识到这在很多方面都是危险的,但老实说,我不需要担心安全问题,因为它只能从内部访问,除了我,没有人会干扰它。