【问题标题】:Sending anonymous functions through socket.io?通过socket.io发送匿名函数?
【发布时间】:2013-01-29 16:31:36
【问题描述】:

我想创建一个客户端函数,它可以使用客户端变量接收和执行任意命令。我将从我的服务器发送这些函数,方法是使用 socket.io 发送一个 JSON 对象,其中包含一个匿名函数,这将是我的命令。它看起来像下面这样:

//client side

socket.on('executecommand', function(data){
    var a = "foo";
    data.execute(a); //should produce "foo"
});

//server side

socket.emit('executecommand', {'execute': function(param){
    console.log(param);
}});

然而,当我尝试它时,客户端收到一个空的 json 对象(data == {}),然后抛出异常,因为数据不包含执行方法。这里出了什么问题?

【问题讨论】:

    标签: json node.js socket.io anonymous-function


    【解决方案1】:

    JSON 不支持包含 function 定义/表达式。

    您可以做的是用您需要的functions 定义一个commands 对象,然后传递一个commandName

    // client-side
    
    var commands = {
        log: function (param) {
            console.log(param);
        }
    };
    
    socket.on('executecommand', function(data){
        var a = 'foo';
        commands[data.commandName](a);
    });
    
    // server-side
    
    socket.emit('executecommand', { commandName: 'log' });
    

    您还可以使用fn.apply() 传递参数并检查commandName 是否与in 匹配的命令:

    // client-side
    var commands = { /* ... */ };
    
    socket.on('executecommand', function(data){
        if (data.commandName in commands) {
            commands[data.commandName].apply(null, data.arguments || []);
        } else {
            console.error('Unrecognized command', data.commandName);
        }
    });
    
    // server-side
    
    socket.emit('executecommand', {
        commandName: 'log',
        arguments: [ 'foo' ]
    });
    

    【讨论】:

      【解决方案2】:

      您不能发送文字 JavaScript 函数并期望它工作。您需要首先对函数进行字符串化(即将它放在一组引号内),然后在客户端评估字符串。

      【讨论】:

      • 我认为使用 eval 被认为是极其危险的?
      • @Ari 在这种特殊情况下非常有效,但在其他情况下 eval 完全有效。
      猜你喜欢
      • 2015-09-18
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2015-02-12
      相关资源
      最近更新 更多