Envoi de fonctions anonymes via socket.io?

Je souhaite créer une fonction côté client pouvant recevoir et exécuter des commandes arbitraires à l’aide de variables côté client. J’enverrai ces fonctions depuis mon serveur en utilisant socket.io pour envoyer un object JSON contenant une fonction anonyme qui sera ma commande. Cela ressemble à ce qui suit:

//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); }}); 

Pourtant, lorsque je l’ai essayé, le côté client a reçu un object json vide ( data == {} ), puis a levé une exception car les données ne contenaient aucune méthode execute. Qu’est-ce qui ne va pas ici?

JSON ne prend pas en charge l’inclusion de définitions / expressions de function .

Au lieu de cela, vous pouvez définir un object commands avec la function vous avez besoin et simplement passer un nom de 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' }); 

Vous pouvez également utiliser fn.apply() pour passer des arguments et vérifier que commandName correspond à une commande avec 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' ] }); 

Vous ne pouvez pas envoyer de fonctions JavaScript littérales et vous attendre à ce que cela fonctionne. Vous devez d’abord hiérarchiser la fonction (c’est-à-dire la placer entre guillemets), puis évaluer la chaîne du côté client.