В дальнейшем мы будем часто обращаться к модулю http, поэтому сейчас небольшая экскурсия по его документации, что в ней есть и где это искать.
Сейчас модуль http совмещает в себе два функционала. Первый – это функционал сервера. http.createServer создает новый объект класса Server. Если передан обработчик, то он ставится на событие request. Второй функционал – это createClient.
Этот метод устарел, есть немножко другой: http.request. Общий смысл такой, что он предназначен для создания http–запросов. При помощи этого метода Node.js может обратиться к другому сайту или серверу. Сам по себе класс http.Server используется мало. Создается объект, вешается обработчик на событие request. Запрос пришел, и при помощи listen сервером назначается определенный port, host.
Далее при получении запроса происходит событие request, и контроль приходит к функции обработчику. Она получает два аргумента. Первый request – объект запроса, входящие данные. Второй – Response – объект ответа.
Давайте начнем с объекта запроса. Сейчас я посмотрю, где он в документации. Тут есть некоторые трудные для понимания места, возможно, в будущем, при переписывании модуля, они будут устранены. ClientRequest – это вовсе не объект запроса, о котором сейчас идет речь. Это объект запроса, если мы используем http.сlient, то есть, если мы при помощи Node.js генерируем этот запрос. А если мы этот функционал не используем, то ClientRequest вообще не причем. Нас интересует IncomingMessage. Именно он – это первый параметр функции обработчика запроса, он получает url, method, headers и некоторые другие свойства.
Хотел бы обратить ваше внимание на то, что здесь находятся не все свойства объекта запроса, потому что IncomingMessage наследует другому классу, который представляет собой так называемый поток. Эти потоки мы в ближайшем будущем обсудим. Поэтому и событие event тоже не единственное. Есть еще, мы перейдем к ним позже.
Обычный цикл работы сервера состоит из того, что мы узнаем, что именно к нам пришло. А дальше отвечаем, осуществляя запись в объект ServerResponse – второй параметр обработчика запроса request. Если есть желание, мы можем поставить свои заголовки. Это делается либо вызовом writeHead, который отправляет их в ответ тут же, либо неявным образом. Неявный означает, в данном случае, что тут же они отправлены не будут, а подождут первой записи. Во многих случаях никакие особые заголовки не требуются. Можно сразу написать ответ, если это веб-страница, то ответ можно записать вызовом response.end и в первом параметре указать текст страницы. Также для записи в ответ есть метод response.write. В отличие от response.end он не закрывает соединение. Поэтому response.write используют в тех случаях, когда мы хотим много-много раз что-то писать в ответ, например, потому что появляются новые данные. В этом случае, для того, чтобы окончить ответ, используется end. Соединение будет висеть до того, пока end не будет вызван или пока его клиент не закроет, либо произойдет какая-то ошибка.
У объекта ответа есть и другие свойства события, которые здесь не упомянуты, потому что эта документация посвящена ServerResponse. А он является наследником другого класса, который в дальнейшем мы тоже изучим. Но на текущий момент мы уже знаем достаточно, чтобы получить запрос и отослать нормальный ответ в браузер.
Материалы урока взяты из следующего скринкаста.
We are looking forward to meeting you on our website soshace.com