Знакомство с Express.
Express
Express - это фреймворк для Node js, который реализовывает слой функций, необходимых для создания эффективных приложений и API. Его использование значительно сокращает написание кода.
Установка
1npm install express --save
Сервер
1const express = require("express");2const app = express();34const port = 8080;56app.get("/", (req, res) => {7 res.status(200).type("text/plain");8 res.send("Home page");9});1011app.get("/about", (req, res) => {12 res.status(200).type("text/plain");13 res.send("About page");14});1516app.use((req, res) => {17 res.status(404).type("text/plain");18 res.send("Not found");19});2021app.listen(port, function () {22 console.log(`Server listens port ${port}`);23});
Node js Express имеет готовые функции обработки HTTP запросов, причем для каждого HTTP метода имеется своя функция.
Метод use()
используется для создания промежуточных обработчиков - Middleware.
Статические файлы
Для того чтобы Node js сервер мог передавать по запросу находящиеся у него статические файлы (изображения, аудио, HTML, CSS, JS), используется функция фреймворка Express static()
.
Добавьте перед определением всех маршрутов следующий код.
1app.use(express.static(`${__dirname}/assets`));
Функция должна вызываться как Middleware с использованием метода use().
В качестве параметра Express static()
принимает имя директории, в которой находятся все статические файлы, но при запросе самих файлов указывать в URL директорию не нужно.
Поиск будет осуществляться относительно указанной директории.
Когда сервер Node js получает запрос, он определяет, что это статический файл, а функция Express static() уже сама знает, что его необходимо искать в директории assets.
Express static() может использоваться неограниченное количество раз. Например, если у вас имеется две директории со статическими файлами и обращение к ним должно происходить в зависимости от запрашиваемого URL, то используется следующая запись.
1app.use('/photos', express.static(`${__dirname}/assets/img`));2app.use('/styles', express.static(`${__dirname}/assets/css`));
Здесь первым параметром методу use() передается начало URL, по которому будут запрашиваться файлы, а вторым параметром - место, где нужно будет его искать.
Пример запросов.
1http://localhost:8080/photos/dog.png2http://localhost:8080/styles/app.css
Чтобы в ответ были возвращены запрашиваемые файлы dog.png и app.css, они должны находиться по пути /assets/images/dog.png
и /assets/styles/app.css
соответственно.
Шаблонизаторы
В Node js для генерации и отдачи HTML-страниц используются шаблонизаторы. Node js шаблонизатор представляет собой специальный модуль, использующий более удобный синтаксис для формирования HTML на основе динамических данных и позволяющий разделять представление от контроллера.
Настройка Node js шаблонизатора осуществляется заданием двух параметров:
views
- путь к директории, в которой находятся шаблоны;view engine
- указание самого шаблонизатора.
Для задания этих параметров используется метод Express
set()
.
1app.set('views', './views');2app.set('view engine', 'handlebars');
Handlebars
Начнем с установки Node js handlebars.
1npm install --save express-handlebars
1const express = require('express');2const app = express();3const handlebars = require('express-handlebars');45const host = '127.0.0.1';6const port = 3000;78app.engine('handlebars', handlebars({defaultLayout: 'main'}));9app.set('views', './views');10app.set('view engine', 'handlebars');1112app.get('/', (req, res) => {13res.render('home', {title: 'Greetings form Handlebars'});14});1516app.listen(port, host, function () {17console.log(`Server listens http://${host}:${port}`);18})
Создадим папку views
views/home.handlebars
1<h1>{{{title}}}</h1>
Создадим основой макет views/layouts/main.handlebars
1<!doctype html>2 <html lang="en">3 <head>4 <meta charset="utf-8">5 <meta name="viewport" content="width=device-width, initial-scale=1">6 <title> Мой первый сервер на Node js</title>7 </head>8 <body>9 {{{body}}}10 </body>11 </html>
С помощью метода engine()
задается настройка Node js handlebars
, конкретно в примере указывается шаблон по умолчанию, в который будут подгружаться шаблоны страниц.
Генерация и отдача представления осуществляется с помощью метода render()
, который принимает два параметра:
- шаблон;
- данные для шаблона в виде объекта (если необходимо).
Важно
Если директория с шаблонами не задана явно, то поиск представлений по умолчанию будет осуществляться в директории views
, а макеты - в views/layouts
Шаблоны Node js handlebars представляют собой обычные файлы HTML в формате handlebars, в которых с помощью специального синтаксиса выводятся передаваемые данные.
Для отображения значения свойства переданного объекта используется запись {{{(название свойства)}}}
.
В макете /views/layouts/main.handlebars
запись {{{body}}}
определяет место, куда при запросе определенной страницы будет вставлено соответствующее ей представление.
Важно
Чтобы сгенерировать представление без макета, в объекте, передаваемом функции render()
укажите свойство layout
со значением false
.
Если хотите использовать макет, отличный от макета по умолчанию, просто укажите его имя.
Помните, что макеты должны находиться в директории layouts
директории с представлениями.
1app.get('/', (req, res) => {2res.render('home', {title: 'Greetings form Handlebars', layout: false});3});
Условия.
В представлениях Node js handlebars предусмотрен механизм отображения той или иной части шаблона в зависимости от определенного условия.
1app.get('/', (req, res) => {2 res.render('home', {3 title: 'Greetings form Handlebars',4 content: 'Description how to use it handlebars'5 });6});
1<h1>{{title}}</h1>2 {{#if content}}3 <p>{{content}}</p>4 {{/if}}
Циклы.
Для вывода данных переданного массива в Node js шаблонизаторе handlebars предусмотрена конструкция, аналогичная работе обычного цикла.
1app.get('/', (req, res) => {2 res.render('home', {3 title: 'Greetings form Handlebars',4 advantages: [5 'simple',6 'flexible',7 'powerful'8 ]9 });10});
1<h1>{{title}}</h1>23{{#if advantages}}4<p>Advantages</p>56<ul>7{{#each advantages}}8 <li>{{this}}</li>9{{/each}}10</ul>11{{/if}}
Частичные представления.
Для переиспользования повторяющейся части шаблона без ее дублирования при каждом использовании имеются частичные представления.
Cоздадим папку partials
partials/advantages.handlebars
1<ul>2 {{#each advantages}}3 <li>{{this}}</li>4 {{/each}}5</ul>
home.handlebars
1<h1>{{title}}</h1>2{{#if advantages}}3<p>Advantages</p>4{{> advantages}}5{{/if}}
Полный пример
Задание
Пользуясь заданием из практики переписать используя следующее:
- Создать Express сервер
- Перенести верстку в шаблонизатор
- Весь текст должен быть сгенерирован через сервер
- Создать страницу 404