2017-02-03 6 views
0

Уважаемые все,JS: Node.js и Socket.io - Глобал и архитектуре

Im работая с JS в течение нескольких недель, и теперь мне нужно немного разъяснений. Я прочитал много источников и много Q & А также здесь, и это то, что я узнал до сих пор.

Все ниже в связи с Node.js и Socket.io

  • Использование глобалов в Node.js "может" быть сделано, но это не лучшая практика, термины: DONT DO IT !
  • С сокетами все обрабатывается на один вызов сокета, что означает, что в памяти нет предыдущего вызова. Звонок попадает и обслуживается, поэтому нет «сохраненных» переменных.

Хорошо, я создаю пример чата, несколько пользователей - все они обслуживаются широковещательной рассылкой, но нет личных сообщений, например.

Довольно просто и довольно нормально. Но теперь я застрял в своем уме и наклоняю голову.

Позволяет сказать:

  • Мне нужно действовать по просьбе
  • Как запрос: "Для всех пользователей, у которых имя BRIAN"

В моей голове Я предположил:

1. Пользовательский объект USER - определены глобально на Node.js

function User(socket) { 
this.Name; 
this.socket = socket; } 

2. чем провести ARRAY из них глобально

users = []; 

и newConnection, создать новый пользователь, передать его сокет и сохранить в массиве для дальнейших действий с помощью

users.push(new User(socket)); 

3. И по просьбе Socket.io, который хочет, чтобы связаться все BRIAN s сделать что-то вроде

for (var i = 0; i < users.length; i++) { 
if(user[i].Name == "BRIAN") { 
    // Emit to user[i].socket 
}} 

Но после попытки и erroring, отладки, прибегая к помощи и читать по-видимому, это НЕ, как что-то подобное должно быть сделано, и каким-то образом я не могу найти правильный способ сделать это, или, по крайней мере, увидеть/понять его. можете ли вы, пожалуйста, помочь мне, указать мне хорошее направление или предложить лучшую практику здесь?Это было бы удивительным :-)

Примечание: Я не хочу, чтобы хранить данные в БД (то есть следующий шаг), я хочу работать на лету.

Спасибо большое за ваши входы

Оливер

ответ

1

в первую очередь, пожалуйста, не ставьте пользователей в глобальной переменной, лучше поставить его в модуле и требуют его в другом месте, когда необходимо. Вы можете сделать это следующим образом:

users.js

var users = { 
    _list : {} 
}; 

users.create = function(data){ 
    this._list[data.id] = data; 
} 

users.get = function(user_id){ 
    return this._list[user_id]; 
}; 

users.getAll = function(){ 
    return this._list; 
}; 

module.exports = users; 

и где-то, где в вашей реализации

var users = require('users'); 

Для вашей проблемы, где вы хотите, чтобы отправить всем пользователям с именем " BRIAN ", Я вижу, что вы можете сделать это хорошо двумя способами.

Первый. Когда пользователь подключен к серверу socketio, позвольте пользователю присоединиться к socketio номер, используя свое имя. так он будет выглядеть следующим образом:

var custom_namespace = io.of('/custom_namespace'); 
custom_namespace.on('connection', function(client_socket){ 
    //assuming here is where you send data from frontend to server 
    client_socket.on('user_data', function(data){ 
     //assuming you have sent a valid object with a parameter "name", let the client socket join the room 
     if(data != undefined){ 
      client_socket.join(data.name); //here is the trick 
     } 
    }); 
}); 

теперь, если вы хотите послать ко всем людям с именем «BRIAN», вы можете достичь его, делая это

io.of('/custom_namespace').broadcast.to('BRIAN').emit('some_event',some_data); 

Второй. При сохранении данных на модуле пользователей и фильтровать его с помощью lodash библиотеки

образец кода

var _lodash = require('lodash'); 
var Users = require('users'); 
var all_users = Users.getAll(); 
var socket_ids = []; 
var users_with_name_brian = _lodash.filter(all_users, { name : "BRIAN" }); 

users_with_name_brian.forEach(function(user){ 
    socket_ids.push(user.name); 
}); 

теперь вместо испускать его по одному на одну итерацию, вы можете сделать это, как это socketio

io.of('/custom_namespace').broadcast.to(socket_ids).emit('some_event',some_data); 

Вот ссылка для lodash documentation

Надеюсь, это поможет.

+1

Wow Theo! Огромное спасибо. Хорошо! Это делает, смысл и определенно помогает мне идти дальше. Хорошо :) спасибо, я продолжаю мой jurney :-) –

+1

С удовольствием помогите спариться – Theo

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

  • Нет связанных вопросов^_^