Создание серверных приложений с использованием Express.js
Введение в разработку веб-приложений на Node.js
Краткое описание Node.js и его преимуществ
Node.js был создан Райаном Далом в 2009 году и быстро завоевал популярность среди разработчиков из-за своих преимуществ перед традиционными платформами для разработки веб-приложений, такими как Apache или Ruby on Rails.
Одним из ключевых преимуществ Node.js является его способность обрабатывать множество одновременных подключений с минимальными затратами памяти и процессорного времени. Это достигается за счет неблокирующего ввода/вывода и событийной модели, которая позволяет серверу обрабатывать множество запросов одновременно, не блокируя при этом другие операции.
В отличие от традиционных платформ, где каждое подключение обрабатывается отдельным потоком, Node.js использует один основной поток и набор обратных вызовов для обработки событий. Это позволяет Node.js обрабатывать тысячи одновременных подключений без существенного увеличения нагрузки на систему.
Еще одним преимуществом Node.js является использование JavaScript на стороне сервера. Это позволяет разработчикам использовать один и тот же язык программирования для написания кода как на клиенте, так и на сервере, что упрощает обмен данными между ними и повышает производительность приложения.
Node.js также имеет большое сообщество разработчиков и широкий выбор фреймворков и библиотек для решения различных задач. Например, Express.js - это популярный фреймворк для разработки веб-приложений на Node.js, который упрощает создание маршрутов, обработку запросов и ответов, а также подключение к базам данных.
Кроме того, Node.js имеет встроенную поддержку протоколов HTTP, HTTPS, TCP и UDP, что делает его идеальным выбором для разработки сетевых приложений реального времени, таких как чаты, игры и системы мониторинга.
В целом, Node.js предоставляет разработчикам мощный набор инструментов для создания высокопроизводительных и масштабируемых веб-приложений с использованием JavaScript на стороне сервера.
Express.js: что это такое и для чего он нужен
Определение Express.js и его роли в разработке веб-приложений
Express.js - это минималистичный и гибкий фреймворк для разработки веб-приложений на Node.js. Он предоставляет набор инструментов и функций для упрощения создания веб-приложений и API, включая обработку маршрутов, middleware, управление сеансами и прочее.
Роль Express.js в разработке веб-приложений заключается в том, что он позволяет разработчикам сосредоточиться на бизнес-логике приложения, а не на низкоуровневых деталях протокола HTTP и управления сервером. Фреймворк обеспечивает простой и удобный способ определения маршрутов и обработки запросов и ответов, что ускоряет разработку и упрощает сопровождение кода.
Express.js также предоставляет возможность использовать middleware для выполнения дополнительной обработки запросов, такой как проверка аутентификации, валидация данных и прочее. Middleware могут быть использованы для обработки ошибок, журналирования и других задач, связанных с обработкой запросов.
Кроме того, Express.js хорошо интегрируется с другими библиотеками и фреймворками Node.js, такими как MongoDB, React и Angular, что делает его идеальным выбором для полностек-разработки веб-приложений.
Преимущества использования Express.js
Использование Express.js в разработке веб-приложений имеет множество преимуществ:
- Простота и гибкость: Express.js предоставляет минималистичный набор инструментов для разработки веб-приложений, что делает его легким в изучении и использовании. Он также гибок и позволяет разработчикам создавать приложения, соответствующие их конкретным потребностям.
- Быстрая разработка: Express.js упрощает создание маршрутов, обработку запросов и ответов, а также подключение к базам данных, что ускоряет разработку приложений.
- Middleware: Express.js предоставляет возможность использовать middleware для выполнения дополнительной обработки запросов. Middleware могут быть использованы для проверки аутентификации, валидации данных, журналирования и других задач.
- Хорошая интеграция: Express.js хорошо интегрируется с другими библиотеками и фреймворками Node.js, такими как MongoDB, React и Angular, что делает его идеальным выбором для полностек-разработки веб-приложений.
- Сообщество и поддержка: Express.js имеет большое сообщество разработчиков и широкую поддержку, что обеспечивает наличие большого количества ресурсов для обучения, а также готовых решений для решения различных задач.
В целом, использование Express.js позволяет разработчикам создавать высокопроизводительные и масштабируемые веб-приложения с минимальными усилиями и затратами времени.
Установка и настройка Express.js
Установка Node.js и npm
Установка Node.js и npm (Node Package Manager) осуществляется следующим образом:
- Загрузите последнюю версию Node.js с официального сайта https://nodejs.org/. Выберите версию, соответствующую вашей операционной системе.
- Установите Node.js на свой компьютер, следуя инструкциям установщика. Во время установки также будет установлен npm.
- После установки вы можете проверить версии Node.js и npm, запустив следующие команды в терминале:
Эти команды должны отобразить версии Node.js и npm, установленные на вашем компьютере.
Также вы можете установить npm отдельно, если он не был установлен вместе с Node.js. Для этого вы можете воспользоваться командой:
Эта команда установит последнюю версию npm глобально на ваш компьютер.
Создание нового проекта Express.js
Чтобы создать новое веб-приложение с использованием Express.js, необходимо выполнить следующие шаги:
- Откройте терминал и создайте новую папку для вашего проекта:
- Инициализируйте новый проект Node.js с помощью команды:
Эта команда запустит интерактивный интерфейс, который поможет вам создать файл package.json для вашего проекта. Вы можете оставить все значения по умолчанию, либо изменить их в соответствии с вашими потребностями.
- Установите Express.js в качестве зависимости вашего проекта, выполнив команду:
Эта команда установит последнюю версию Express.js и сохранит ее в файле package.json вашего проекта.
Создайте новый файл с именем app.js (или любым другим именем, которое вам нравится) в корневой папке вашего проекта. Этот файл будет содержать код вашего приложения.
Откройте файл app.js и добавьте следующий код, чтобы создать простое приложение Express.js:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`Server listening at http://localhost:${port}`);
});
Этот код создает новый экземпляр приложения Express.js, определяет маршрут для главной страницы и запускает сервер на порту 3000.
- Сохраните файл app.js и запустите приложение, выполнив команду:
Эта команда запустит сервер, и вы сможете просмотреть ваше приложение, перейдя по адресу http://localhost:3000 в браузере.
Настройка основных параметров приложения
После создания нового проекта Express.js необходимо настроить основные параметры приложения. Вот некоторые из наиболее важных параметров, которые могут быть настроены:
- Порт: Порт, на котором запущен сервер, можно изменить, обновив значение переменной port в файле app.js. Например, чтобы изменить порт на 8080, необходимо изменить строку кода следующим образом:
- Маршруты: Маршруты могут быть настроены с помощью метода app.get() или app.post() и других методов HTTP. Например, чтобы добавить новый маршрут для страницы “О нас”, необходимо добавить следующий код в файл app.js:
- Шаблонизатор: Для генерации HTML-страниц можно использовать шаблонизатор, такой как EJS или Handlebars. Для установки шаблонизатора необходимо установить его в качестве зависимости проекта и настроить его в файле app.js. Например, для установки и настройки EJS необходимо выполнить следующие действия:
Добавьте следующий код в файл app.js:
- Middleware: Middleware могут быть использованы для выполнения дополнительной обработки запросов, такой как проверка аутентификации, валидация данных и прочее. Middleware могут быть добавлены с помощью метода app.use(). Например, для добавления middleware для журналирования запросов необходимо добавить следующий код в файл app.js:
- Статические файлы: Для предоставления статических файлов, таких как изображения, стили и скрипты, необходимо настроить middleware для обслуживания статических файлов. Например, чтобы предоставить статические файлы из папки public, необходимо добавить следующий код в файл app.js:
Эти настройки позволят настроить основные параметры приложения Express.js в соответствии с вашими потребностями.
Маршрутизация в Express.js
Определение маршрутов и обработчиков запросов
Маршрутизация в Express.js позволяет настроить маршруты для обработки запросов клиентов. Маршрут - это сопоставление между путем URL и одним или несколькими обработчиками запросов. Когда клиент отправляет запрос на сервер, Express.js использует маршруты для определения соответствующего обработчика запроса.
Определение маршрутов в Express.js осуществляется с помощью методов HTTP, таких как app.get(), app.post(), app.put() и других. Например, для определения маршрута для главной страницы сайта можно использовать следующий код:
В этом примере определен маршрут для пути “/” с помощью метода GET. Когда клиент отправляет GET-запрос на этот путь, Express.js вызывает указанный обработчик запроса, который отправляет ответ “Hello World!” клиенту.
Обработчик запроса - это функция, которая вызывается для обработки запроса и формирования ответа. Обработчик запроса принимает два аргумента: объект запроса (req) и объект ответа (res). Объект запроса содержит информацию о запросе клиента, такую как заголовки, параметры и тело запроса. Объект ответа содержит методы для формирования ответа, такие как res.send() для отправки текста и res.json() для отправки JSON-объекта.
Маршруты могут также включать параметры, которые позволяют определить переменные в пути URL. Например, для определения маршрута для просмотра информации о пользователе можно использовать следующий код:
app.get('/users/:id', function(req, res) {
const userId = req.params.id;
// Обработка запроса для пользователя с указанным идентификатором
});
В этом примере определен маршрут для пути “/users/:id”, где :id является параметром. Значение параметра доступно через свойство params объекта запроса.
Express.js также поддерживает использование middleware для обработки запросов. Middleware - это функции, которые вызываются между получением запроса и вызовом обработчика запроса. Middleware могут использоваться для выполнения дополнительной обработки запросов, такой как проверка аутентификации, валидация данных и прочее.
Использование middleware для обработки запросов
Middleware в Express.js - это функции, которые вызываются между получением запроса и вызовом обработчика запроса. Middleware могут использоваться для выполнения дополнительной обработки запросов, такой как проверка аутентификации, валидация данных, журналирование и многое другое.
Middleware-функция имеет доступ к объекту запроса (req), объекту ответа (res) и функции next(). Функция next() вызывается для передачи управления следующей middleware-функции или обработчику запроса.
Вы можете определить middleware-функцию следующим образом:
function logger(req, res, next) {
console.log(`Request method: ${req.method}`);
console.log(`Request URL: ${req.url}`);
next();
}
В этом примере middleware-функция logger выводит в консоль метод и URL запроса, а затем вызывает функцию next() для передачи управления следующей middleware-функции или обработчику запроса.
Для использования middleware в приложении Express.js ее необходимо добавить с помощью метода app.use(). Например:
В этом примере middleware-функция logger будет вызываться для всех запросов к приложению.
Middleware также может быть использована для обработки определенных типов запросов или путей. Например, вы можете определить middleware-функцию для проверки аутентификации и использовать ее только для маршрутов, требующих аутентификации:
function authenticate(req, res, next) {
// Проверка аутентификации
if (/* пользователь аутентифицирован */) {
next();
} else {
res.status(401).send('Unauthorized');
}
}
app.get('/secured', authenticate, function(req, res) {
// Обработка запроса к защищенному ресурсу
});
В этом примере middleware-функция authenticate проверяет аутентификацию пользователя и вызывает функцию next() только в случае успешной аутентификации. В противном случае она отправляет ответ с кодом состояния 401 Unauthorized. Middleware-функция authenticate используется только для маршрута ‘/secured’.
Работа с параметрами маршрутов и запроса
В Express.js вы можете работать с параметрами маршрутов и запроса.
Параметры маршрута определяются с помощью символа “:”. Например, вы можете определить маршрут для просмотра профиля пользователя следующим образом:
app.get('/users/:id', function(req, res) {
const userId = req.params.id;
// Обработка запроса к профилю пользователя с идентификатором userId
});
В этом примере параметр маршрута “id” доступен через свойство params объекта запроса (req.params.id).
Параметры запроса передаются в строке запроса после символа “?”. Вы можете получить доступ к ним через свойство query объекта запроса. Например:
app.get('/search', function(req, res) {
const query = req.query.q;
// Обработка запроса поиска с параметром query
});
В этом примере параметр запроса “q” доступен через свойство query объекта запроса (req.query.q).
Кроме того, Express.js предоставляет middleware для анализа тела запроса, такого как json и urlencoded. Это middleware автоматически парсит тело запроса и предоставляет доступ к нему через свойство body объекта запроса. Например:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.post('/login', function(req, res) {
const username = req.body.username;
const password = req.body.password;
// Обработка запроса входа в систему с параметрами username и password
});
В этом примере middleware bodyParser.json() и bodyParser.urlencoded() используются для анализа тела запроса в форматах JSON и x-www-form-urlencoded соответственно. Параметры запроса доступны через свойство body объекта запроса (req.body.username и req.body.password).
Шаблонизация и представление данных
Использование шаблонизаторов (например, EJS или Handlebars)
В Express.js вы можете использовать шаблонизаторы для генерации HTML-страниц на основе динамических данных. Одними из популярных шаблонизаторов для Node.js являются EJS и Handlebars.
EJS (Embedded JavaScript) - это шаблонизатор, который использует синтаксис встраиваемого JavaScript для генерации HTML-кода. Для использования EJS в приложении Express.js необходимо установить пакет ejs и настроить его в качестве движка представлений:
const express = require('express');
const app = express();
app.set('view engine', 'ejs');
app.set('views', __dirname + '/views');
app.get('/', function(req, res) {
const data = { title: 'My Website', message: 'Welcome to my website!' };
res.render('index', data);
});
В этом примере устанавливается EJS в качестве движка представлений и указывается папка views для хранения файлов представлений. Маршрут “/” генерирует HTML-страницу с помощью представления index.ejs и передает туда данные в виде объекта data.
Handlebars - это шаблонизатор, который использует синтаксис “mustache” для генерации HTML-кода. Для использования Handlebars в приложении Express.js необходимо установить пакет express-handlebars и настроить его в качестве движка представлений:
const express = require('express');
const exphbs = require('express-handlebars');
const app = express();
app.engine('handlebars', exphbs());
app.set('view engine', 'handlebars');
app.get('/', function(req, res) {
const data = { title: 'My Website', message: 'Welcome to my website!' };
res.render('index', data);
});
В этом примере устанавливается Handlebars в качестве движка представлений и маршрут “/” генерирует HTML-страницу с помощью представления index.handlebars и передает туда данные в виде объекта data.
Шаблонизаторы позволяют разделить логику представления и логику приложения, что облегчает поддержку и масштабирование кода. Вы можете выбрать любой шаблонизатор в зависимости от своих предпочтений и требований проекта.
Примеры шаблонов
Вот примеры шаблонов для EJS и Handlebars.
EJS:
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
</head>
<body>
<h1><%= message %></h1>
<ul>
<% for(let i = 0; i < items.length; i++) { %>
<li><%= items[i] %></li>
<% } %>
</ul>
</body>
</html>
В этом примере шаблона EJS используются теги <% %>
для выполнения кода JavaScript и теги <%= %>
для вывода значений переменных. Значения переменных title
, message
и items
передаются в шаблон из маршрута приложения.
Handlebars:
<!DOCTYPE html>
<html>
<head>
<title>{{title}}</title>
</head>
<body>
<h1>{{message}}</h1>
<ul>
{{#each items}}
<li>{{this}}</li>
{{/each}}
</ul>
</body>
</html>
В этом примере шаблона Handlebars используются двойные фигурные скобки {{}}
для вывода значений переменных и блок {#each} {{/each}}
для перебора массива items
. Значения переменных title
, message
и items
передаются в шаблон из маршрута приложения.
Шаблоны позволяют генерировать HTML-код динамически на основе данных, которые передаются в них из приложения. Это упрощает создание сложных веб-страниц и делает код более читабельным и поддерживаемым.
Передача данных из маршрутизатора в шаблон
Для передачи данных из маршрутизатора в шаблон, вы можете использовать второй аргумент метода res.render()
. Этот аргумент должен быть объектом, свойства которого будут доступны в шаблоне в качестве переменных.
Например, если вы используете шаблонизатор EJS, то можете передать данные следующим образом:
app.get('/', function(req, res) {
const data = {
title: 'Мой сайт',
message: 'Добро пожаловать на мой сайт!'
};
res.render('index', data);
});
В этом примере объект data
содержит два свойства: title
и message
. Эти свойства будут доступны в шаблоне index.ejs
в качестве переменных <%= title %>
и <%= message %>
.
Аналогично, если вы используете шаблонизатор Handlebars, то можете передать данные следующим образом:
app.get('/', function(req, res) {
const data = {
title: 'Мой сайт',
message: 'Добро пожаловать на мой сайт!'
};
res.render('index', data);
});
В этом случае переменные будут доступны в шаблоне Handlebars как {title}
и {message}
.
Работа с базами данных
Подключение к базе данных (например, MongoDB или PostgreSQL)
Для подключения к базе данных в приложении Express.js необходимо использовать соответствующий драйвер. Например, для подключения к MongoDB можно использовать драйвер mongoose
, а для подключения к PostgreSQL - драйвер pg
.
Подключение к MongoDB с использованием mongoose
:
- Установить
mongoose
с помощью npm:
- Подключиться к базе данных в файле приложения:
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => console.log('Connected to MongoDB'))
.catch(() => console.error('Failed to connect to MongoDB'));
Подключение к PostgreSQL с использованием pg
:
- Установить
pg
с помощью npm:
- Подключиться к базе данных в файле приложения:
const { Pool } = require('pg');
const pool = new Pool({
user: 'myuser',
host: 'localhost',
database: 'mydatabase',
password: 'mypassword',
port: 5432,
});
pool.query('SELECT NOW()', (err, res) => {
console.log(err, res)
pool.end()
})
В этом примере используется пул подключений (Pool
), чтобы обеспечить эффективное использование ресурсов базы данных.
Использование ORM (например, Sequelize или Mongoose) для работы с базой данных
ORM (Object-Relational Mapping) - это инструмент, который предоставляет удобный интерфейс для работы с базой данных, используя объектно-ориентированный подход. ORM позволяет работать с базой данных как с набором объектов, а не писать SQL-запросы вручную.
Например, для работы с MongoDB в качестве ORM можно использовать Mongoose
. Для работы с PostgreSQL - Sequelize
.
Подключение и использование Mongoose
:
- Установить
mongoose
с помощью npm:
- Определить схему для коллекции в базе данных:
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
name: String,
email: String,
password: String
});
const User = mongoose.model('User', userSchema);
- Использовать модель для работы с базой данных:
const newUser = new User({ name: 'John', email: 'john@example.com', password: '12345' });
newUser.save((err) => {
if (err) console.error(err);
else console.log('User saved successfully');
});
Подключение и использование Sequelize
:
- Установить
sequelize
и соответствующий диалект для вашей базы данных (например,pg
для PostgreSQL) с помощью npm:
- Определить модель для таблицы в базе данных:
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'postgres'
});
const User = sequelize.define('User', {
name: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
password: {
type: DataTypes.STRING,
allowNull: false
}
});
- Использовать модель для работы с базой данных:
const newUser = await User.create({ name: 'John', email: 'john@example.com', password: '12345' });
console.log('User saved successfully', newUser);
ORM упрощает работу с базой данных, позволяя использовать объектно-ориентированный подход и избегая необходимости писать SQL-запросы вручную.
CRUD-операции с данными
CRUD-операции (Create, Read, Update, Delete) являются базовыми операциями для работы с данными в базе данных.
В Express.js с использованием ORM, такого как Sequelize или Mongoose, CRUD-операции выполняются следующим образом:
- Создание (Create):
- Чтение (Read):
const users = await User.findAll(); // получение всех пользователей
const user = await User.findByPk(1); // получение пользователя с id=1
- Обновление (Update):
- Удаление (Delete):
Эти операции могут быть реализованы в маршрутизаторе Express.js для предоставления API для взаимодействия с базой данных. Например, маршрут для создания нового пользователя может выглядеть следующим образом:
app.post('/users', async (req, res) => {
const { name, email, password } = req.body;
try {
const newUser = await User.create({ name, email, password });
res.status(201).json(newUser);
} catch (error) {
res.status(500).json({ message: 'Error creating user' });
}
});
Аналогичным образом могут быть реализованы маршруты для чтения, обновления и удаления данных.
Отладка и тестирование приложения
Использование отладчика Node.js
Отладчик Node.js позволяет разработчику выполнять код пошагово, просматривать значения переменных, ставить точки останова и выполнять другие действия, необходимые для отладки приложения.
Для использования отладчика Node.js необходимо выполнить следующие шаги:
- Запустить приложение в режиме отладки с помощью команды
node inspect app.js
. Это запустит приложение с отладчиком Node.js. - Открыть в браузере страницу
about:inspect
(для Chrome) илиabout:debugging
(для Firefox) и выбрать запущенный процесс Node.js. - В отладчике установить точки останова в нужных местах кода, просматривать значения переменных и выполнять другие действия для отладки приложения.
- После завершения отладки закрыть отладчик и остановить приложение.
Отладчик Node.js является мощным инструментом для отладки приложений, разработанных на Node.js и Express.js. Он позволяет разработчику быстро находить и исправлять ошибки в коде, улучшая качество и производительность приложения.
Тестирование приложения с использованием библиотек (например, Mocha или Jest)
Тестирование является важной частью разработки приложений, и Express.js не является исключением. Для тестирования приложений Express.js можно использовать различные библиотеки, такие как Mocha, Jest, Chai и другие.
Например, для тестирования маршрутов приложения с использованием Mocha и Chai необходимо выполнить следующие шаги:
- Установить необходимые библиотеки:
mocha
,chai
,chai-http
. - Создать файл тестов, например
test/routes.test.js
. - В файле тестов написать код для тестирования маршрутов приложения с использованием
chai-http
. Например:
const chai = require('chai');
const chaiHttp = require('chai-http');
const app = require('../app');
chai.use(chaiHttp);
const expect = chai.expect;
describe('GET /api/users', () => {
it('should return all users', done => {
chai.request(app)
.get('/api/users')
.end((err, res) => {
expect(res).to.have.status(200);
expect(res.body).to.be.an('array');
done();
});
});
});
- Запустить тесты с помощью команды
mocha
.
Тестирование позволяет проверять работоспособность приложения, обнаруживать ошибки и регрессии, а также улучшать качество кода. Использование библиотек для тестирования, таких как Mocha и Jest, значительно облегчает процесс тестирования и делает его более эффективным.
Деплой приложения
Подготовка приложения к деплою
Подготовка приложения к деплою включает в себя несколько шагов, необходимых для того, чтобы приложение работало корректно в производственной среде.
- Установка зависимостей: перед деплоем необходимо убедиться, что все необходимые зависимости установлены. Для этого можно использовать команду
npm install --production
. - Настройка конфигурации: необходимо убедиться, что приложение настроено на использование правильных конфигурационных параметров для производственной среды, таких как адрес базы данных, ключи API и т.д.
- Сборка статических файлов: если приложение использует статические файлы, такие как HTML, CSS и JavaScript, необходимо собрать их в один пакет для развертывания на сервере.
- Создание скрипта запуска: необходимо создать скрипт запуска приложения, который будет использоваться для запуска приложения на сервере. Этот скрипт должен включать в себя команду запуска приложения, а также любые необходимые параметры конфигурации.
- Установка сервера: необходимо убедиться, что сервер, на котором будет размещено приложение, настроен корректно и соответствует требованиям приложения.
После выполнения этих шагов приложение готово к деплою на сервер. Для деплоя можно использовать различные инструменты, такие как Heroku, AWS, Azure и другие.
Развертывание приложения на сервере (например, Heroku или AWS)
Развертывание приложения на сервере может быть выполнено с помощью различных инструментов и сервисов. Два популярных варианта - это Heroku и AWS.
Развертывание на Heroku:
- Установить Heroku CLI.
- Создать новый проект на Heroku с помощью команды
heroku create
. - Добавить удаленный репозиторий Heroku в локальный репозиторий приложения с помощью команды
heroku git:remote -a <имя_приложения>
. - Установить необходимые зависимости для производственной среды, указав их в файле
package.json
. - Опубликовать код приложения на Heroku с помощью команды
git push heroku master
. - Запустить приложение на Heroku с помощью команды
heroku open
.
Развертывание на AWS:
- Создать новую учетную запись AWS или воспользоваться существующей.
- Создать новую виртуальную машину с помощью AWS EC2.
- Подключиться к виртуальной машине с помощью SSH.
- Установить необходимое программное обеспечение на виртуальную машину, включая Node.js и любые другие зависимости.
- Скопировать код приложения на виртуальную машину.
- Установить зависимости приложения с помощью npm.
- Запустить приложение на виртуальной машине.
Выбор способа развертывания зависит от конкретных требований приложения и предпочтений разработчика. Heroku предоставляет простой и удобный способ развертывания приложений, в то время как AWS предоставляет больше гибкости и контроля над средой развертывания.