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

问题描述 投票:0回答:3

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

json node.js socket.io anonymous-function
3个回答
10
投票

JSON 不支持包含

function
定义/表达式。

您可以做的是使用您需要的

commands
定义一个
function
对象,然后只传递
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' ]
});

4
投票

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


0
投票

我最终是这样做的。

将功能放在公共位置(

const.js
此处)并发送密钥。

// const.js
const FNS = {
  timer: { exec: t => console.log(`You have ${t} seconds!`) },
}

// server
const FNS_KEYS = Object.keys(CONST.FNS).reduce((m,k) => (m[k]=k,m), {})
socket.emit('execute', FNS_KEYS.timer)

// client
socket.on('execute', key => CONST.FNS[key]?.exec(30))
© www.soinside.com 2019 - 2024. All rights reserved.