Введение
Создадим проект
Точка входа
Статьи
Добавляем HTML몭шаблоны
Устанавливаем шаблонизатор
Первый шаблон
Добавляем просмотр статей
Добавляем статью
Заключение
Введение
Зачем нам нужен фреймворк?
Создадим проект
Чтобы каждый раз не приходилось настраивать проект с нуля,
разработчики Nest.js вооружили нас консольной утилитой —
@nestjs/cli. Установим ее глобально:
npm i @nestjs/cli ‐g
nest new nestjs‐getting‐started
npm run start:dev
Точка входа
Точкой входа в приложение на Nest.js, как и в любом другом MVC몭
подобном фреймворке, являются контроллеры. Пока в приложении
имеется один: app.controller.몭s:
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
@Controller()
export class AppController {
@Get()
index() {
return { articles: [] };
}
}
{
"articles": []
}
Статьи
Пришло время наполнить блог статьями. Но что такое «статья»?
Каждая статья — объект, который будет иметь уникальный
идентификатор, заголовок и контент.
export class Article {
id: number;
title: string;
content: string;
constructor (title: string, content: string, id?: number) {
this.id = id;
this.title = title;
this.content = content;
}
}
import { Article } from './article.model';
export const articles: Article[] = [
new Article('The first one', 'Lorem ipsum ....', 1),
new Article('The second one', 'Lorem ipsum ....', 2)
]
import { articles } from './articles';
@Controller()
export class AppController {
@Get()
index() {
return { articles };
}
}
Если теперь запустить приложение, мы увидим в браузере следующее:
{
"articles": [
{
"id": 1,
"title": "The first one",
"content": "Lorem ipsum ...."
},
{
"id": 2,
"title": "The second one",
"content": "Lorem ipsum ...."
}
]
}
Добавляем HTML몭шаблоны
Для того, чтобы пользователю было комфортнее работать с сайтом,
сервер должен вернуть браузеру ответ не в формате json, а в виде
html-страницы.
Устанавливаем шаблонизатор
Nest.js по умолчанию не устанавливает никаких движков
шаблонизации, так как не знает, какой именно по душе пользователю.
Мы для этого примера возьмём pug (ранее известный как jade). Этот
пакет нам придется установить самостоятельно:
npm install pug
Чтобы подключить pug, перепишем функцию boo몭strap (main.ts):
import { join } from 'path';
import { NestExpressApplication } from '@nestjs/platform‐express';
async function bootstrap() {
/*
* Добавим параметр типа к методу create, показывая, что мы хотим работать
* с объектом app, как с приложением express.
*/
const app = await NestFactory.create<NestExpressApplication>(AppModule
// Сообщим приложению, где искать наши views.
app.setBaseViewsDir(join(__dirname, '../views'));
// И укажем, какой шаблонизатор использовать
app.setViewEngine('pug');
await app.listen(3000);
}
Первый шаблон
Наш первый шаблон index.pug будет выглядеть так:
doctype html
html(lang="en")
head
meta(charset="UTF‐8")
meta(http‐equiv="X‐UA‐Compatible", content="IE=edge")
meta(name="viewport", content="width=device‐width, initial‐scale=1.0")
title SuperBlog!
body
h1 Welcome to SuperBlog!
// Конструкция "each" позволяет перебрать массив и для каждого элемента
ul
each article in articles
// #{...} — интерполяция. Так шаблонизатор понимает, что сюда надо
li #{article.title} <a href="...">Читать</a>
import { Render } from '@nestjs/common';
@Controller()
export class AppController {
@Get()
@Render('index')
index() {
return { articles };
}
}
Читайте также:
Что такое webpack ex몭ernals и как их настроить.
import { Render, Param, ParseIntPipe } from '@nestjs/common';
...
@Get(':id')
@Render('article')
getById(@Param('id', ParseIntPipe) id: number) {
return articles.find(article => article.id === id);
}
doctype html
html(lang="en")
head
meta(charset="UTF‐8")
meta(http‐equiv="X‐UA‐Compatible", content="IE=edge")
meta(name="viewport", content="width=device‐width, initial‐scale=1.0")
title #{title}
style
body
h1 #{title}
p #{content}
a(href="/") Назад
Шапка будет та же самая, только в тэге title мы выведем название
статьи. В теле страницы — ожидаемо title и content, а также ссылка
«назад» — на главную страницу.
li #{article.title}
a(href=article.id) Читать
Добавляем статью
Чтобы создать новую статью, браузер должен отправить на сервер
title и content POST몭запросом. Чтобы реализовать это, добавим в
контроллер перед методом article два новых метода:
import { Body, Post, Redirect } from '@nestjs/common';
import { Article } from './article.model';
@Get('create')
@Render('create‐article')
getForm(): void {
return;
}
@Post('articles')
@Redirect('/', 301)
create(@Body() body: any): void {
const id = articles.length + 1;
const article = new Article(body.title, body.content, id);
articles.push(article);
}
doctype html
html
head
title Новая статья
style
body
h1 Новая статья
form(method="POST" action="/articles")
input(type="text" name="title")
input(type="text" name="content")
button(type="submit") Создать
doctype html
html(lang="en")
head
meta(charset="UTF‐8")
meta(http‐equiv="X‐UA‐Compatible", content="IE=edge")
meta(name="viewport", content="width=device‐width, initial‐scale=1.0")
title SuperBlog!
body
h1 Welcome to SuperBlog!
ul
each article in articles
li #{article.title}
a(href=article.id) Читать
a(href="create") Создать
Заключение
Nest.js позволяет нам написать простое приложение с минимальными
усилиями. Однако истинная мощь фреймворка станет очевидна при
более глубоком погружении. Среди особенно мощных возможностей,
выделяющих его на фоне других:
Eonae
07 июля 2022
Рекомендуемые программы
С нуля до разработчика. Возвращаем деньги, если не удалось найти
работу.
Профессия с нуля
Фронтенд-разработчик
Разработка фронтенд-компонентов для веб-
приложений
19 января ὕ 10 месяцев
Онлайн-буткемп. Фронтенд-
разработчик
Интенсивное обучение профессии в режиме полного
дня
9 февраля ὕ 4 месяца
Профессия с нуля
Python-разработчик
Python-разработчик
Разработка веб-приложений на Django
19 января ὕ 10 месяцев
Профессия с нуля
Java-разработчик
Разработка приложений на языке Java
19 января ὕ 10 месяцев
Профессия с нуля
PHP몭разработчик
Разработка веб-приложений на Laravel
19 января ὕ 10 месяцев
Профессия с нуля
Инженер по тестированию
Ручное тестирование веб-приложений
19 января ὕ 4 месяца
Профессия с нуля
Node.js-разработчик
Разработка бэкенд-компонентов для веб-приложений
19 января ὕ 10 месяцев
Профессия с нуля
Fulls몭ack-разработчик
Разработка фронтенд- и бэкенд-компонентов для веб-
приложений
19 января ὕ 16 месяцев
Профессия c опытом
19 января ὕ 5 месяцев
Профессия с нуля
Верстальщик
Верстка с использованием последних стандартов CSS
Аналитик данных
Сбор, анализ и интерпретация данных
ALSO ON RU.HEXLET.IO/BLOG
8 Комментариев
1
Войти
G Присоединиться к обсуждению...
Имя
2 0 • Ответить • Поделиться ›
И пожалуйста исправьте ошибки в тексте статьи, как минимум те, на которые уже
указали 8 месяцев(!) назад.
Это же не сложно, попробовать выполнить действия по вашей же статье - и увидеть
как что-то не работает.
Святослав Иванов
⏲ 8 месяцев назад
Модератор > Данил Замешаев − ⚑
Индивидуальное обучение
Документы
Корпоративное обучение
Условия использования
Вопросы по урокам
8 800 100 22 47 бесплатно
по РФ Рекомендуемые книги
Помощь
Справка
Вопросы и ответы
support@hexlet.io
Улучшить Хекслет
Наши проекты
Хекслет Колледж
Code Basics
Codeba몭tle
Hexlet Guides
Хекслет-резюме
Хекслет Runit
ἱ Язык