【问题标题】:running custom functions with node and socket.io使用 node 和 socket.io 运行自定义函数
【发布时间】:2013-07-06 14:24:45
【问题描述】:

所以我希望能够使用节点通过 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 在发送内容时会从参数中删除函数吗?

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

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

    所以试试类似的东西:

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

    【讨论】:

    • 没有这样的运气。我更改了代码,以便客户端只有 socket.on('runFunction', function(data) { data.fn.apply(this, data); }}) 但是当我调用它时,服务器只记录 {"id " : "-sasf9akdn"} 所以 fn 甚至没有到达服务器。不知何故 somwehere 节点或套接字正在运行它并从正在发送的数据中删除
    • console.log(data) 看看会发生什么
    • 我做到了,在 socket.on('customFunction'... customFunction', {id: sessionId, fn: function() { alert('something'); } }); 和客户端记录同样的事情,fn 就消失了
    【解决方案2】:

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

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

    祝你好运:)

    【讨论】:

    • 不错的主意,我知道 eval,这就是我永远不会使用它的原因:)。这里的主要思想是纯动态编码,最终目标本质上是在对服务器的调用中编写我想在服务器上运行的功能。这样我就不必真正更新服务器上的代码来添加新功能,我可以动态编写我需要运行的函数并将其发送到服务器以在服务器上执行。我意识到这在很多方面都很危险,但老实说,我不需要担心安全性,因为它只能从内部访问,除了我之外没有人会弄乱它。
    猜你喜欢
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    相关资源
    最近更新 更多