2013-05-28 5 views
3

Я создаю службу, которая фрагментирована по нескольким модулям, которые необходимы, когда это необходимо. Мне нужно получить доступ к переменной «запрос» от маршрутизатора во всех моих модулях.Передача переменных во все модули

Моего текущее решения (которое было предложено в других потоках для передачи переменных в целом), чтобы передать его каждый требуемый модуль:

вар a_module = требуется («./ a_module») (Req) ;

и экспорт каждого модуля в функции:

module.exports = функция (REQ) { ... }

Но это многословным и включает в себя необходимости экспортировать мой модули как функции и только имеющие доступ к этой переменной в объеме экспортируемых функций. В идеале я хотел бы иметь доступ к переменной во всем требуемом модуле.

Есть ли другой элегантный способ сделать это, что мне не хватает? Как объявление переменной req как глобальной для всего приложения?

+0

Вы используете Express или просто NodeJS? –

+0

Да Я нахожусь Экспресс – gwendall

+1

Узел обрабатывает несколько запросов асинхронно в том же процессе, в отличие от PHP. Если вы установите 'req' в качестве глобального и обрабатываете несколько запросов одновременно, тогда' req' будет сбиваться, поэтому я не думаю, что вы должны использовать глобальные переменные, за исключением случаев, когда они являются постоянными и универсальными. –

ответ

3

Этот вопрос будет запрашивать мнения, а не ответы, поэтому он не подходит для переполнения стека, но вот мои $ 0,02.

Вам нужно отступить и спросить себя, действительно ли вы написали так много модулей, которым нужен доступ к объекту запроса. Я не думаю, что у вас есть. То, что вы должны писать, - это функции, которые берут конкретные данные, в которых они нуждаются, - не больше и не меньше. Все эти функции почти наверняка не нуждаются в полном запросе. Как многие из них действительно нуждаются в доступе к каждому HTTP-заголовку, например? Подумайте о своей программе как о наборе операций над объектами/данными домена. Например, возможно, есть функция, которая берет запись учетной записи пользователя и продвигает ее от обычного пользователя к администратору. Для этой функции требуется учетная запись пользователя. Он не должен быть связан с объектом HTTP-запроса.

Просто напишите кучу чисто развязанных функций, которые принимают небольшое количество точных параметров и делают с ними что-то полезное. Это называется «свободная связь». Затем организуйте группы связанных функций в модуль. Это называется «сплоченность». Затем используйте некоторый код «клей», чтобы извлечь необходимые параметры из объекта HTTP req и передать их в качестве аргументов для этих функций. Эти же функции должны работать для интерфейса командной строки или другого не-HTTP-интерфейса. Они будут легче понимать, тестировать и более долгоживущие, если вы их кодируете таким образом, вместо того, чтобы сходить с ума в каждой строке каждого модуля, зная о текущем объекте HTTP req.

+0

Очень хороший ответ, спасибо! – gwendall

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