2013-07-06 2 views
1

Поэтому я хотел был бы иметь возможность запускать пользовательскую функцию через socket.io, используя узел . Моя основная идея довольно проста, я просто не могу заставить ее работать. Вообще говоря, можно было бы написать что-то похожее на это, чтобы запустить функцию на входящем сообщении ...Выполнение пользовательских функций с узлом и socket.io

//server 
socket.on('incomingMessage', function(data) { 
    console.log(data); 
    io.sockets.emit('newMessage', {id: data.id, from: data.name, message: data.message}); 
}); 
//client 
socket.on('newMessage', function(data) { 
    $('#messages').html($('#messages').html() + data.message); 
    $('#from').html($('#from').html() + data.from); 
}); 

но то, что я хотел бы сделать, это позволить, чтобы быть намного более динамичным и фактически передать функции, я хочу, чтобы запустить в самом сообщении, так что-то вроде этого ...

//server 
socket.on('customFunction', function(data) { 
    console.log(data); 
    io.sockets.emit('runFunction', data); 
}) 

//client 
socket.on('runFunction', function(data) { 
    for(var index in data) { 
     args.push(data[index]); 
    } 
    data.fn.apply(this, args); 
}); 

, но когда я называю это от клиента, используя что-то вроде ...

socket.emit('customFunction', {id: sessionId, name: user.name, callBack: function() { alert('it worked'); 
    } 
}); 

на сервере единственное, что logs - это идентификатор сеанса и имя, callBack (независимо от имени, я попробовал func, run, cb, callBack, customFunc) просто исчезает. так что я немного растерялся. У кого-нибудь есть идеи? заблаговременно за помощь. Я не уверен, почему, но при вызове этого он только регистрирует идентификатор сеанса и элементы имени, обратный вызов или fn или что-то еще, просто нет. Удаляет ли узел или socket.io функции из аргументов при отправке данных?

ответ

0

Вы преобразования данных в массив, а затем попытаться вызвать свойство не имеет больше то, применяя данные функции socket.on (this)

так попробовать что-то вроде:

socket.on('runFunction', function(data) { 
    var arg = []; 
    args.push(data.id); 
    args.push(data.name); 
    // etc... 
    data.callback.apply(this, args); 
}); 
+0

нет такой удачи. Я изменил код, так что у клиента просто есть socket.on ('runFunction', функция (данные) { data.fn.apply (это, данные); }}) , но когда я называю это журналами сервера только {"id": "-sasf9akdn"}, так что fn даже не попадает на сервер. каким-то узким узлом или сокетом его запускает и удаляет из отправляемых данных – Rob

+0

console.log (данные) и видит, что происходит – raam86

+0

Я сделал это на обоих серверах в socket.on (функция customFunction '..., которая только регистрирует " {id: "fdsicnsdev4a"} "при вызове с ... socket.emit ('customFunction', {id: sessionId, fn: function() {alert ('something');}}); и клиент записывает то же самое, fn просто ушел – Rob

0

Я не знаю, получил ли я вас, но насколько я вижу, у вас есть два варианта.

  1. преобразовать функцию в строку, вы можете сделать это с помощью ToString() или toSource() Eval его на другой стороне (узел или клиент). Но, может быть, и, надеюсь, вы этого не хотите :) - Важно то, что функция не сериализована, если вы используете JSON.stringify или любое решение для платформы.

  2. Создайте индекс своих вызываемых функций и используйте индекс, чтобы идентифицировать функцию с другой стороны.

Пример:

//create a index on one side 
var runtime = { 
"addMessage":function(param1,param2){ alert(arguments) }, 
"whatEverFunction":function(){} 
} 

socket.on("runtime",function(data){ 
if(!runtime[data.fn])return alert("runtime error"); 
runtime[data.fn].apply(null,data.args); 
} 


//create a call on the other 
socket.io.emit({fn:"addMessage",args:["paramAValue","paramBValue"]}); 

Если это не поможет, вы можете проверить, если библиотека «dnode» делает то, что вы хотите.

Удача :)

+0

неплохие идеи, я знаю об eval, поэтому я никогда не буду использовать его :). Основная идея здесь - это чисто динамическое кодирование, конечной целью является, по существу, написать функцию, которую я хочу запустить на сервере в вызове на сервер. Таким образом, мне никогда не нужно действительно обновлять код на сервере, чтобы добавить новые функции, я могу динамически написать функцию, которую мне нужно запустить, и отправить ее на сервер, который будет выполнен на сервере. Я понимаю, что это опасно во многих отношениях, но, честно говоря, мне не нужно беспокоиться о безопасности, поскольку она доступна только изнутри, и никто не будет возиться с ней, кроме меня. – Rob

Смежные вопросы