2017-01-09 4 views
0

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

В главном app.js Я включил файл контроллера для аутентификации «users.js», в котором я использую переменную, например, var onlineusers = {}; При каждом входе значение вставляется в эту переменную. Для обработки чата сокета я использовал другой файл контроллера с именем chat.js, где мне нужно использовать одну и ту же переменную онлайн-пользователей.

Рассмотрим теперь 3 файла app.js, user.js, chat.js

In app.js 
var users = require('./users.js'); 
var chat = require('./chat.js'); 
users.set(app); 
chat.set(app,io); 


In user.js 

module.exports.set = function(app) { 
// var onlineusers modified in some function 
} 

In chat.js 

module.exports.set = function(app,io) { 
// var onlineusers modified in some function 
} 

Что мне нужно будет делить значение переменной вар onlineusers разных модулей (user.js и chat.js)

+0

Храните переменную в одном модуле и экспортируйте метод, который извлекает значение. Затем вы можете получить значение той же переменной из любого модуля. – jfriend00

+0

Еще один запрос: влияет ли это на производительность, если число пользователей Интернета увеличивается. Также мне нужно использовать переменные для комнат, а также – Ajith

+0

Нет, это не влияет на производительность по мере увеличения количества пользователей в Интернете. В период вашего сервера загружен один экземпляр модуля. Вы просто создаете функцию доступа, чтобы получить некоторые данные, хранящиеся в модуле. Это общий и хороший способ обмена данными, которые не имеют недостатков масштабируемости. – jfriend00

ответ

1

Что бы я сделал, это изменить функции chat.js и user.js .set, чтобы принять другой параметр, называемый онлайн-пользователями. Затем из app.js вы можете передать значение onlineUsers для каждой модификации .set-функций.

// In app.js 
var users = require('./users.js'); 
var chat = require('./chat.js'); 
var onlineUsers = new require('./onlineUsers')(); 
users.set(app, onlineUsers); 
chat.set(app,io, onlineUsers); 

// In user.js 
module.exports.set = function(app, onlineUsers) { 
    // onlineusers modified in some function 
}; 

// In chat.js 
module.exports.set = function(app, io, onlineUsers) { 
    // onlineusers modified in some function 
}; 

// In onlineUsers.js 
module.exports = function(params) { 
    // constructor for onlineUsers data model 
}; 

Это работает, потому что JavaScript проходит по значению.

'use strict'; 
let obj = {}; 
(function firstModifier(obj) { 
    obj.first = true; 
})(obj); 
console.log(obj); 

Это будет работать только в определенной степени. Я бы решительно рассмотрел возможность использования базы данных для этого типа работы. Для управления онлайн-пользователями с узлом & socket.io я нашел mongodb и redis, чтобы оба были действительно хорошими вариантами. Полезная выгода от этого заключается в том, что ваша сборка онлайн-пользователей основана на базе данных вместо использования переменной onlineUsers в памяти приложения. Тогда ваше приложение может просто получить доступ к db вместо «совместного использования» переменной.

+0

Спасибо за ваш ответ. Один вопрос, что вы думаете об использовании глобальной переменной в отдельном файле «onlineUsers.js», как вы упомянули выше, вместо базы данных. Если мы используем базу данных, это может вызвать некоторую задержку при выполнении при различных обновлениях и выборки также проблемы параллелизма ?. Поэтому я планирую использовать переменную, но меня беспокоит, почему вы сказали, что «Variable будет работать до предела». – Ajith

+0

Это будет работать в той степени, в которой вы ограничены памятью приложения. Это может быть очень хорошо для вашего использования. Если у вас много онлайн-пользователей и они хранят значительную сумму данных для каждого из этих пользователей (т. Е. Массив больших объектов), то один экземпляр узла может не выполнять эту работу. См. Http://stackoverflow.com/questions/7193959/memory-limit-in-node-js-and-chrome-v8. Я думаю, что использование onlineUsers.js, как указано выше, или использование подхода @ jfriend00 совершенно нормально, если вы не ожидаете, что сможете управлять этим множеством пользователей. – Yod

+0

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

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