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

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

Идеи?


person adamwtiko    schedule 31.08.2011    source источник


Ответы (5)


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

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

person Evert    schedule 31.08.2011
comment
То, что вы сказали, правильно, но вы действительно можете использовать домены узлов для достижения того, о чем он просит. Пожалуйста, смотрите сообщение ниже. - person CBP; 29.02.2016
comment
Я думаю, что этот ответ просто повторяет вопрос. Есть варианты. Домены и продолжение-локальное-хранилище. Честно говоря, я не уверен, что какой-либо из этих вариантов был доступен на момент публикации. - person tybro0103; 22.03.2016

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

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

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

person b_erb    schedule 31.08.2011

Узловые домены.

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

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

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

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

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

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

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

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

person CBP    schedule 29.02.2016

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

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

person tybro0103    schedule 22.03.2016

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

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

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

person stewe    schedule 31.08.2011