11. Уроки Node.js. Эхо-сервер.

nodejs-avanzado

Всем привет! На этом занятии мы создадим эхо-сервер, то есть, такой сервер, который при запросе на url /echo c  параметром message выдает значение этого параметра:

На все другие запросы отвечает: Страница не найдена.

Начнем вот с такого шаблона:

Создается сервер, и ему дается функция –  обработчик на request. Первый шаг обработки запроса – это понять, что за запрос вообще к нам пришел. Для этого мы воспользуемся свойствами method и url объекта запроса, добавим в тело нашей функции:

Запускаю и обращаюсь в браузер к этой странице. Обратите внимание, я перешел по этому url:

http://127.0.0.1:3000/echo?message=Hello

и оно при помощи console.log вывело, что метод называется GET, и то, что было запрошено: GET /echo?message=Hello

Опять переключаюсь на браузер и видно, что он ничего не вывел. Браузер чего-то ожидает. Ответа! Потому что сервер, если не дать явной команды, написать что-то в ответ,  делать ничего не будет. В этом явное отличие  Node.js от многих существующих серверов, он делает только то с соединением, что ему скажешь. Если ему не сказать: отошли ответ,  он ничего не отсылает. Соответственно получается, что соединение есть, функция request отработала, но она ничего не сделала для того, чтобы ответить на него, поэтому запрос завис. Он будет висеть столько, сколько браузер или сервер считают нужным. Кому первому надоест, тот первый и оборвет соединение.

Итак, теперь давайте ответим сообщением, которое нам было прислано в параметре message. Для этого мне нужно понять, что конкретно находится в message. Напомню задачу, если url вот такой:  /echo?message=Hello

и есть параметр message, то нужно отослать его значение, а иначе будет: Страница не найдена. Соответственно, для того, чтобы разобрать url, можно, конечно, воспользоваться регулярными выражениями. Но в Node.js есть для этого специальный модуль url, добавим его:

Использую его для того, чтобы разобрать переданную строку запроса. Этот метод называется url.parse:

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

Есть еще параметр message. Как определить, есть ли параметр message, ведь у меня queryэто строка? Самый простой способ – это добавить еще один аргумент в команде url.parse, которая, если указан true, разберет эту строку в объект

Соответственно, message будет его значением:

Если все это есть, то давайте ответим:

Ну а если нет? Тогда нужно ответить: Страница не найдена. Для этого ставится соответствующий код ответа и тело страницы:

В итоге получиться вот так:

Перезапускаем сервер и заходим в браузер. Все работает.

Теперь давайте зайдем по другому url: Page not found. Если сейчас открою вкладку Network, то здесь мы увидим, что Page not found имеет код ответа 404, а, соответственно, нормальный urlстандартный код ответа 200.

Итак, эхо-сервер готов и работает. Нам было важно его начать, потому что эхо-сервер является прототипом реального приложения. Реальные приложения также получают запросы различного вида и выдают на них ответы.

Следующая наша тема: Работа с заголовками. Я попрошу обратить на нее особое внимание, если вы в серверной разработке новичок и раньше преимущественно разрабатывали на клиенте.

Когда браузер делает запрос, то вместе с url он отправляет дополнительную информацию, которая указывает, что это за браузер и детали того, что он хочет запросить. Информация эта в специальном формате, называется заголовками и доступна она так: req.headers.

Закоментируем часть кода для лучшего понимания, получится вот так;

запускаем, переходим на страницу и видим заголовки в терминале, которые отправил браузер. Каждый заголовок имеет имя и значение. Обратите внимание, что все заголовки в Node.js имеют имя в нижнем регистре. Это особенность именно Node.js. В данном случае host передается в заголовки, connectionkeepalive, означает, что браузер хотел по этому сетевому соединению гнать новые и новые запросы, то, о чем мы говорили раньше: Connection один, requestмного.

Далее, детали того, что это за браузер и что он хотел бы получить. В ответ на такой запрос сервер отвечает, конечно же, телом страницы и тоже заголовками, в которых, в частности, находится статус. Как правило, статус – это 200. Такой статус по умолчанию называется OK, и означает, что страница сгенерирована нормально. Раскоментируем наш код. И добавим в if :

Другой распространенный статус – 404, который обычно называется not foundстраница не найдена. Есть и другие статусы, например, 403 – доступ запрещен, 500 – серверная ошибка. Также есть и другие серверные заголовки. Сейчас перезапустим сервер:

Во вкладке Network, а именно в Headers, видно все эти заголовки. Есть заголовки, которые отправил браузер, и есть те, которые получил браузер от сервера. Нажмите view source , чтобы получить дополнительную картину. Появятся дополнительные заголовки, это более полный вид. Статус ОК, как мы говорили, и прочие заголовки здесь более-менее стандартные.

Давайте поставим какие-нибудь другие наиболее важные серверные заголовки, которые обычно приходится ставить вручную. Это заголовки, которые касаются типов содержимого или кеширования (caching). Например, если я делаю веб-сервис, то я, вполне возможно, не хочу, чтобы результаты ответа сервиса кешировались. Для этого я поставлю заголовок cachecontrol, nocache. Можно сделать его понадежнее, добавив еще опций, но для примера обойдемся коротким вариантом:

Теперь запустим сервер и в браузере посмотрим, что у нас с заголовками. Изменения легко заметить: появился дополнительный заголовок cachecontrol, nocache, то есть, тот, который мы высылали.

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

А теперь немного отойдем от общего http и вернемся к Node.js. Для того, чтобы работать с заголовками, у ответа res. есть два принципиально разных метода. Первый метод проиллюстрирован здесь:

В статус-код ставится и setHeader или removeHeader – добавляют или удаляют заголовок. При этом сами заголовки будут отправлены на сервер не сейчас, не когда написал setHeader, а вместе с ближайшей записью каких-то данных, например, вызов res.end – отправляет ответ и заголовки тоже. Второй способ управления заголовками называется явный. Выглядит он так:

Он отличается тем, что при этом, заголовки пишутся в ответ тут же, не ожидая начала ближайшей записи. Иногда такое тоже бывает нужно. Но обычно вполне хватает таких вот: статус-код и setHeader.

Код этого урока находится в нашем репозитории.

echodeveloplogo

Материалы урока взяты из следующего скринкаста.

We are looking forward to meeting you on our website soshace.com 

About the author

Stay Informed

It's important to keep up
with industry - subscribe!

Stay Informed

Looks good!
Please enter the correct name.
Please enter the correct email.
Looks good!

Related articles

Уроки Express.js . Логгер, Конфигурация, Шаблонизация с EJS. Часть 2.

Favicon – это все connect Middleware, он смотрит, если url имеет вид favicon.ico, то он читает favicon и ...

3. Уроки Express.js. Шаблонизация с EJS: Layout, Block, Partials

В реальной жизни у нас обычно больше, чем один шаблон. Более того, если уж так ...

24.11.2016

Уроки Express.js. Основы и Middleware. Часть 2.

Всем привет! Давайте продолжим наш урок об основах Express и Middleware. Итог (добавим в ...

Sign in

Forgot password?

Or use a social network account

 

By Signing In \ Signing Up, you agree to our privacy policy

Password recovery

You can also try to

Or use a social network account

 

By Signing In \ Signing Up, you agree to our privacy policy