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

svujldwt  于 5个月前  发布在  Node.js
关注(0)|答案(3)|浏览(48)

我想创建一个客户端函数,它可以使用客户端变量接收和执行任意命令。我将通过使用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。

ao218c7q

ao218c7q1#

JSON不支持包含function定义/表达式。
你可以做的是用你需要的function s定义一个commands对象,然后传递一个commandName

// client-side

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

socket.on('executecommand', function(data){
    var a = 'foo';
    commands[data.commandName](a);
});

个字符
你也可以使用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' ]
});

的字符串

quhf5bfb

quhf5bfb2#

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

ki1q1bka

ki1q1bka3#

我最终是这样做的。
把函数放在一个公共的地方(这里是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))

字符串

相关问题