Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 通过socket.io发送匿名函数?_Json_Node.js_Socket.io_Anonymous Function - Fatal编程技术网

Json 通过socket.io发送匿名函数?

Json 通过socket.io发送匿名函数?,json,node.js,socket.io,anonymous-function,Json,Node.js,Socket.io,Anonymous Function,我想创建一个客户端函数,它可以使用客户端变量接收和执行任意命令。我将使用socket.io从服务器发送这些函数,以发送包含匿名函数的JSON对象,该函数将作为我的命令。它看起来如下所示: //client side socket.on('executecommand', function(data){ var a = "foo"; data.execute(a); //should produce "foo" }); //server side socket.emit('e

我想创建一个客户端函数,它可以使用客户端变量接收和执行任意命令。我将使用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=={}
),然后抛出一个异常,因为数据不包含任何方法执行。这里出了什么问题?

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

JSON不支持包含
函数
定义/表达式

您可以使用所需的
函数定义
commands
对象,只需传递
commandName

// client-side

var commands = {
    log: function (param) {
        console.log(param);
    }
};

socket.on('executecommand', function(data){
    var a = 'foo';
    commands[data.commandName](a);
});
您还可以使用传递参数并检查
commandName
是否与以下命令匹配:


我认为使用eval?@Ari被认为是极其危险的,在这种特殊情况下,它非常危险,但在其他情况下eval完全有效。
// server-side

socket.emit('executecommand', { commandName: 'log' });
// 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' ]
});