« 22 »  05  20 15 г.




Заполните таблицу примерами из текста упр 204

Express: веб-фреймворк для Node. HTTPServer, просто вызовите метод createServer. С помощью нашего экземпляра приложения мы можем задавать маршруты, основанные на HTTP-методах, в данном примере app. HTTPSServer, мы совершаем те же действия, что и выше, но к тому де передаем объект опций, содержащий ключ, сертификат и другие параметры, о которых написано в документации модуля https NodeJS. } ; Конфигурирование Express поддерживает произвольные окружения environmentsкак например, production и development. Разработчики могут использовать метод configureчтобы добавить нужные для данного окружения функции. Когда configure вызывается без имени окружения, он будет срабатывать в любом окружении прежде чем сработает любой configure, в котором окружение задано. В приведенном ниже примере мы просто используем опцию dumpExceptions и в режиме разработки выдаем клиенту в ответ стек-трейс исключения. В обоих же режимах мы используем прослойку methodOverride и bodyParser. Обратите внимание на использование app. Настройки Из коробки Express поддерживает следующие настройки: home - базовый путь приложения, который используется для res. Для этого мы определяем привелденный ниже маршрут. Значения, связанные с именованными полями, доступны в объекте res. Также можно сразу передавать регулярное выражение. Но поскольку группы в регулярных выражениях не именуются, к ним можно добраться в req. Так первая группа попадает в req. Такая конструкция не будет срабатывать, если значение поля содержит нечисловые символы. Передача управления на другой маршрут Вызвав третий аргумент - nextможно передать управление на следующий маршрут. Если соответствие не найдено, управление передается назад в Connect, и прослойки продолжают вызываться в порядке, в котором они были включены с помощью use. Так же работают несколько маршрутов, имеющих один и тот же путь. Они просто вызываются по очереди, до того момента, когда один их них ответит вместо того, чтобы вызвать next. Ниже мы используем этот метод для извлечения юзера из базы данных и назначения его в req. Так удобнее добавлять прослойки внутри блоков configureчто более прогрессивно. Так, когда Connect получает запрос, выполняется первая прослойка, добавленная через createServer или use. Она вызывается с тремя параметрами: request, response и callback-функция, обычно называемая next. Это важно учитывать, так так множество прослоек зависят друг от друга. Например methodOverride обращается к req. Другой пример - парсинг cookies и поддержка сессий - вначале необходимо вызывать use для cookieParserзатем для session. Множество Express-приложений может иметь строчку app. Это может показаться странным, но это нужно просто для того, чтобы явным образом указать прослойку, которая включает в себя все созданные нами маршруты. Эту прослойку можно включать в любом порядке, хотя по умолчанию она включается в конце. Изменяя ее позицию, можно управлять очередностью ее выполнения. Например, нам нужен обработчик ошибок, который будет срабатывать после всех других прослоек и отображать любое исключение, переданное в него с помощью next. Или же может понадобиться понизить очередность выполнения прослойки, обслуживающей статические файлы, чтобы позволить другим маршрутам перехватывать запросы к таким файлам и, например, считать количество скачиваний и т. Вот как это может выглядеть: app. Потом мы парсим тело запроса если таковое имеетсязатем куки, далее сессию, чтобы req. Однако, если мы определим маршрут, как показано ниже, можно будет записывать статистику, отклонять загрузки, списывать оплату за загрузки, и т. Это полезно, если нужно ограничить доступ либо подгружать какие-либо данные перед использованием маршрута, и т. Обычно асинхронное получение данных может выглядеть примерно как показано ниже тут мы берем параметр :id и грузим данные юзера. Как можно заметить, абстрагируя логику с помощью прослоек, можно как добиться повторного использования прослоек, так и сделать код маршрута более красивым. В нижеприведенном примере только авторизованный юзер может редактировать свой аккаунт. Бывают случаи, когда надо пропустить остальные прослойки маршрута в стеке, но продолжить выполнение следующих маршрутов. Для этого надо вызывать next с аргументом route: next "route". Если не осталось маршрутов для выполнения, Express ответит ошибкой 404 Not Found. HTTP-методы Мы уже неоднократно пользовались app. Самый распространенный пример использования POST - это отправка формы. В примере ниже мы просто делаем HTML-форму. А потом управление будет передаваться маршруту, который мы определим в следующем примере. Для этого мы должны сказать useкак показано ниже: app. Чтобы этого добиться, нужно сначала задействовать прослойку methodOverrideкоторая будет помещена после bodyParserчто позволит ей использовать req. В зависимости от нужд приложения, можно и не использовать. И тогда методы PUT и DELETE все так же будут доступны, но уже напрямую. В то же вреям methodOverride - это отличное решение для HTML-форм. Ниже показан пример использования метода PUT: app. Тут мы проверяем instanceof NotFound и показываем страницу 404, или же передаем управление следующему обработчику ошибок. Заметьте, что эти обработчики могут быть определены где угодно, поскольку они все равно будут помещены ниже обработчиков маршрутов в listen. Это позволяет их определять внутри блоков configureтак что можно обрабатывать исключения по-разному в зависимости от текущего окружения. Например когда Node делает операции с файловой системой, можно получить объект ошибки с полем error. Например, если нужно в окружении development показывать исключения в stderr, можно сделать так: app. В таком случае нужно установить showStack в true: app. Пред-обработки параметров маршрута Пред-обработки параметров маршрута могут существенно улучшить читабельность приложения, через явную загрузку данных и валидацию URL запроса. В примере ниже мы вызываем app. Как можно заметить мы получаем аргумент id, который содержит имя поля. Таким образом мы загружаем объект пользователя и выполняем обычную обработку ошибок и простой вызов nextчтобы передать управление на следующее пред-условие либо уже на обработчик маршрута. {движок}, где {движок} - это название модуля шаблонизатора, который должен быть подключен. Чтобы изменить это поведение, можно пользоваться методом app. Например можно сделать, чтобы foo. Ниже - пример, использующий для рендеринга index. И поскольку мы не используем layout:false, отрендеренный контент представления index. Так например при использовании Jade можно сделать так: app. Однако мы по-прежнему можем использовать сразу несколько шаблонизаторов: res. Например если вы не так часто используете лэйауты, можно написать так: app. Например, если у нас view engine установлен в jade, и файл лэйаута называется. Например, вместо того, чтобы итерировать в представлении циклом для отображения списка комментариев, можно просто использовать фрагмент collection: partial 'comment', { collection: comments } ; Если другие опции или локальные переменные не нужны, то можно пропустить объект и просто передать массив данных. Дополнительную документацию см в разделе res. Примечание: используйте коллекции осторожно, так как рендеринг массива в 100 элементов означает рендеринг 100 представлений. Для простых коллекций лучше итерировать циклом внутри представления, а не использовать коллекции. Так нагрузка будет меньше. Поиск представлений Поиск представлений производится относительно родительского преставления. Например, мы можем вызвать res. Использовать index-файлы можно также из представления в той же директории. Так вызовом partial 'users' можно обратиться к представлению. Шаблонизаторы Ниже представлены несколько шаблонизаторов, часто используемых с Express: - встроенный JavaScript - шаблонизация на основе CoffeeScript для Node Поддержка сессий Поддержку сессий можно включить используя Connect-овскую прослойку session. Также для этого нам нужна вышележащая прослойка cookieParser, которая будет парсить куки и помещать их в req. Например connect-redis поддерживает хранилище сессий в Redis. Для более полной информации см. Руководство по миграции Разработчики, работавшие с Express 1. Когда заголовок Accept отсутствует, возвращается true. В противном случае проверяется соответствие типа, а потом подтипов. Например, пусть нам нужно сделать красивую проверку является ли входящий запрос изображением. Для этого можно зарегистрировать коллбэк 'an image': app. Также можно использовать подстановочные символы. Это упростит наш пример с изображением. Тут мы будем проверять только тип: req. Проверяет параметры маршрута req. Для этого включите прослойку bodyParser. По умолчанию - пустая строка. По умолчанию доступна строка '%s': req. Проверяет заголовок X-Requested-With на предмет того, что запрос сделан с помощью XMLHttpRequest: req. Опционально может быть передано имя файла. По умолчанию вызывается next errоднако если передан callback, то надо это делать явно, или обрабатывать ошибку. Например, чтобы изменить размер буфера: res. Внутри него вы можете отвечать, как если бы заголовок еще не был передан. } ; Также можно опционально передать второй коллбэк - callback2. В нем обрабатываются ошибки, связанные с соединением. Однако в нем не следует пытаться посылать ответ. Вот как это используется: res. Однако если он был вручную, явным образом задан в res. Заметьте, что в этом методе происходит завершение ответа аналогично res. Этот метод идеален для организации JSON-API, однако JSON можно посылать также с помощью res. Статус-код по умолчанию - 302. Опции: httpOnly, secure, expires, и т. Таким образом наш вышеупомянутый пример теперь можно переписать так: res. Опции те же, что у res. Передаваемые опции являются по совместительству локальными переменными представления. Например, если вы передаете свойство status, то оно не только становится доступно представлению, а также устанавливает статус-код ответа. Это также полезно, если шаблонизатор принимает определенные опции, например debug или compress. Ниже - пример того, как можно отрендерить страницу ошибки - тут передается status как для его отображения, так и для установки статус-кода res. Этот метод всегда доступен из представления как локальная переменная. По умолчанию - имя представления. Имя его происходит из имени представления. Следующие конструкции эквивалентны друг другу имя коллекции, переданное фрагменту, везде будет "movie". При этом имя локальной переменной для этого объекта образуется из имени представления. Перечисленные ниже примеры эквивалентны: partial 'movie', { locals: { movie: movie } } partial 'movie', { movie: movie } partial 'movie', { object: movie } Такой же самый API может быть использован из маршрута, чтобы можно было ответить HTML-фрагментом через AJAX или WebSockets, например можно отрендерить коллекцию пользователей напрямую из маршрута: app. Под локальными переменными в данном случае имеются в виду переменные, передаваемые в методы рендеринга представления, например в res. Также можно добраться до настроек через appsettings: app. Заметьте, что можно устанавливать несколько обработчиков ошибок, путем нескольких вызовов этого метода, однако метод должен вызывать nextесли он не хочет сам обрабатывать исключение: app. Также Express предоставляет по умолчанию несколько локальных переменных: settings - объект настроек приложения layout path указать лэйаут прямо изнутри представления Этот метод имеет псевдоним app. Динамические помощники представлений - это просто функции, принимающие res, req и выполняемые в контексте экземпляра Server перед тем, как отрендерить любое представление. Возвращаемое значение такой функции становится локальной переменной, с которой функция ассоциирована. Допустим, есть такие маршруты: app. Это может пригодиться для фреймворков более высокого уровня, построенных на Express. Например следующее эквивалентно: app. Это может пригодиться, чтобы понять какие маршруты имеют возможность ответить. Допустим, есть следующие маршруты: app. Живой пример - Haml. В примере ниже мы ассоциируем расширение. Рендерить в HTML будем только первый раз - для большей производительности - и будем поддерживать подстановку переменных вида "{name}".




Роман Миллер

Так же работают несколько маршрутов, имеющих один и тот же путь. Обратите внимание на использование app.