node.js сделать запрос и ответ глобальным для HTTP-сервера? - PullRequest
5 голосов
/ 01 сентября 2011

Я только что начал на node.js и пробежал http://nodebeginner.org/index.html. Отличное учебное пособие по началу работы, но я действительно хочу знать, возможно ли сделать запрос и ответ «глобальным», чтобы любой модуль загружался для текущего входящего запрос может получить доступ к этим ... вместо инъекций.

Идеи? * * 1005

Ответы [ 5 ]

5 голосов
/ 01 сентября 2011

В отличие от большинства языков веб-сценариев, в Node многие HTTP-запросы от разных клиентов могут быть «активными» одновременно. Как вы узнаете, на какого клиента вы отвечаете?

Итак, хотя вы думаете, что в каждый момент времени существует только 1 запрос и ответ, на самом деле есть открытые запросы для всех текущих клиентов.

2 голосов
/ 29 февраля 2016

Node Domains.

Это старый вопрос, я понимаю, но ни один из ответов не является полностью правильным.

Правда в том, что вы можете достичь этой функциональности, используя Node Domains.

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

При этом я лично сталкивался со многими хорошими вариантами использования глобальных переменных в рамках одного запроса.

Пример. Отслеживание одного запроса через множество уровней кода становится невозможным без этого,если вы не выставите свой запрос (или req ID) слоям, он просто не принадлежит.(т. е. Service, DAL и т. д. храните ваш запрос в вашем контроллере, где бы он ни находился).

По сути, передача переменных через многие уровни просто так, чтобы они были доступны на нижних уровнях моего приложения, является неустойчивой иделает код очень грязным.

Прежде чем вы начнете кричать, да, я знаю, что Домены были объявлены устаревшими, начиная с Узла 5, и я также знаю, что это не тот случай использования Доменов, как это задокументировано.Но сейчас Node завершает работу над новым API, который, будем надеяться, продолжит решать эту проблему.

https://nodejs.org/api/domain.html

2 голосов
/ 01 сентября 2011

Из-за асинхронного цикла событий теоретически можно сделать глобально доступным вариабельный запрос и ответ ... НО, как только вы вернетесь из своего текущего контекста (даже при вызове другого асинхронного содержимого), следующее событие вочередь будет выполнена.

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

Имея только один поток, выполняющий ваш собственный код, все, очевидно, является поточно-ориентированным.Но вам все равно нужно защищаться от недопустимых состояний (переменных и т. Д.), Потому что вы никогда не знаете, какое следующее событие / обратный вызов будет выполнено.

1 голос
/ 22 марта 2016

extension-local-storage решает эту проблему.Если я правильно понимаю, есть некоторые сходства с доменами, только это не считается устаревшим.: D

Этот пост объясняет это немного.И связанные слайд-шоу .

0 голосов
/ 01 сентября 2011

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

Лучше передать ссылки на объекты запроса и ответа непосредственно в модуль.

Имейте в виду, что объекты передаются по ссылке, поэтомупри передаче объектов в функции / модули нет больших накладных расходов.

...