Добро пожаловать в полное руководство о том, как начать разработку серверной части с помощью Express.js — популярной платформы Node.js, которая обеспечивает гибкость, масштабируемость и производительность для создания надежных и безопасных серверных приложений. В этой подробной статье мы углубимся в основы Express.js и предоставим вам экспертную информацию, практические примеры и ценные советы, когда вы приступите к путешествию по разработке серверной части.

Введение

Бэкенд-разработка является важной частью создания веб-приложений, которые занимаются обработкой данных, бизнес-логикой и функциями на стороне сервера. Express.js — одна из популярных, быстрых и минималистичных веб-платформ для Node.js. Это популярный выбор для создания надежных и масштабируемых серверных приложений. В этой статье мы рассмотрим подробное руководство о том, как начать разработку серверной части с помощью Express.js. В этой статье мы рассмотрим ключевые концепции, рекомендации и практические примеры, которые помогут вам начать работу.

Предпосылки

Прежде чем углубляться в Express.js, важно иметь общее представление о JavaScript, Node.js и концепциях веб-разработки, таких как HTTP, RESTful API и операции CRUD. Мы также коснемся этих тем, если вы еще не работали с Express.js.

Убедитесь, что на вашем устройстве установлены Node.js и npm (диспетчер пакетов Node), чтобы следовать примерам из этой статьи.

Начало работы с Express.js

Чтобы иметь возможность использовать Express.js, вам нужно сначала установить его как зависимость в нашем проекте Node.js. Откройте свой терминал и создайте новый каталог для вашего бэкэнд-проекта. Вы должны перейти в каталог проекта (в данном случае это ваша корневая папка) и запустить следующую команду, чтобы инициализировать новый проект Node.js.

npm init -y

Это создаст новый файл package.json в каталоге проекта. В этом файле будут храниться метаданные и зависимости проекта. Теперь давайте установим Express.js, выполнив следующую команду:

npm install express

Это установит Express.js как зависимость в вашем проекте. Когда процесс установки будет завершен, вы можете начать использовать Express.js в своем бэкэнд-приложении.

Настройка сервера Express.js

Чтобы иметь возможность использовать Express.js в качестве сервера, нам нужно потребовать модуль Express из пакета, который мы уже установили, и создать экземпляр приложения Express. В основной файл проекта (например, index.js) добавьте следующий код для инициализации expressjs.

const express = require('express');
const app = express();

Здесь нам требуется модуль express, и мы создаем экземпляр приложения Express, вызывая функцию express(). Который возвращает объект приложения Express, который мы можем использовать для настройки нашего сервера.

Настройка серверных маршрутов

В Express.js маршруты используются для обработки различных HTTP-запросов, таких как GET, POST, PUT, DELETE и т. д. Эти маршруты определяются тем, как сервер должен реагировать на эти запросы.

Давайте определим простой маршрут для обработки GET-запроса к корневому URL-адресу («/») и возврату «Hello, World!» ответ:

app.get('/', (req, res) => {
  res.send('Hello, World!');
});

В этом примере мы используем метод app.get() для определения маршрута для обработки запросов GET к корневому URL-адресу ('/'). Второй аргумент метода app.get() — это функция обратного вызова, которая принимает два параметра:

req (представляющий объект запроса)

res (представляющий объект ответа)

В функции обратного вызова мы используем метод res.send() для отправки клиенту ответа Hello, World!.

Запуск сервера:

Чтобы запустить сервер Express.js, нам нужно прослушивать входящие запросы на определенном порту. Давайте определим номер порта (например, 3000) и обновим наш код следующим образом.

const express = require('express');
const app = express();
const port = 3000; // Define the port number

app.get('/', (req, res) => {
  res.send('Hello, World!');
});

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

В этом примере мы используем метод app.listen() для запуска сервера и прослушивания входящих запросов.

В данном случае указан номер порта 3000.

Второй аргумент метода app.listen() — это функция обратного вызова, которая выполняется после запуска сервера. В этой функции обратного вызова мы используем console.log() для вывода сообщения о том, что сервер работает и прослушивает указанный порт.

Обработка различных HTTP-запросов

Express.js может обрабатывать различные HTTP-запросы, такие как GET, POST, PUT, DELETE и т. д. Давайте посмотрим, как мы можем обрабатывать различные типы HTTP-запросов с помощью Express.js.

Обработка POST-запросов

Для обработки запроса POST мы можем использовать метод app.post(). Давайте определим маршрут для обработки POST-запроса к URL-адресу «/api/users» и возврата ответа JSON.

app.post('/api/users', (req, res) => {
  // Logic to handle POST request
  const newUser = req.body; // Assuming request body contains user data
  // Save the new user to the database
  res.json(newUser); // Send JSON response
});

В этом примере мы используем метод app.post() для определения маршрута обработки POST-запросов к URL-адресу «/api/users». Внутри функции обратного вызова мы можем получить доступ к данным, отправленным в теле запроса, с помощью объекта req.body (Примечание: вам необходимо использовать промежуточное программное обеспечение, такое как body-parser, для анализа тела запроса перед доступом к нему).

Затем мы можем выполнить любую необходимую логику, например сохранить данные в базе данных, и отправить ответ JSON обратно клиенту, используя метод res.json().

Обработка запросов PUT

Для обработки запроса PUT мы можем использовать метод app.put(). Давайте определим маршрут для обработки запроса PUT на URL-адрес /api/users/:id и обновления данных пользователя в базе данных.

app.put('/api/users/:id', (req, res) => {
  // Logic to handle PUT request
  const userId = req.params.id; // Assuming user ID is passed as a URL parameter
  const updatedUserData = req.body; // Assuming request body contains updated user data
  // Update the user data in the database
  res.json(updatedUserData); // Send JSON response
});

В этом примере мы используем метод app.put() для определения маршрута обработки запросов PUT к URL-адресу /api/users/:id, где :id — это параметр URL-адреса, представляющий идентификатор пользователя.

Внутри функции обратного вызова мы можем получить доступ к параметру URL, используя объект req.params, и данные, отправленные в теле запроса, используя объект req.body. Затем мы можем выполнить любую необходимую логику, такую ​​как обновление пользовательских данных в базе данных, и отправить ответ JSON обратно клиенту.

Обработка запросов DELETE

Для обработки запроса DELETE мы можем использовать метод app.delete(). Давайте определим маршрут для обработки запроса DELETE к URL-адресу /api/users/:id и удаления данных пользователя из базы данных.

app.delete('/api/users/:id', (req, res) => {
  // Logic to handle DELETE request
  const userId = req.params.id; // Assuming user ID is passed as a URL parameter
  // Delete the user data from the database
  res.send(`User with ID ${userId} has been deleted`); // Send response
});

В этом примере мы используем метод app.delete() для определения маршрута обработки запросов DELETE к URL-адресу /api/users/:id. Внутри функции обратного вызова мы можем получить доступ к параметру URL с помощью объекта req.params и выполнить любую необходимую логику, например, удалить данные пользователя из базы данных. Затем мы можем отправить ответ обратно клиенту, используя метод res.send().

Обработка ответов об ошибках

Как бэкэнд-разработчик, важно изящно обрабатывать ответы об ошибках, чтобы предоставлять содержательную обратную связь клиентам. Express.js предоставляет встроенное промежуточное ПО для обработки ошибок, которое позволяет нам обрабатывать ошибки централизованно. Давайте посмотрим, как мы можем обрабатывать ошибки с помощью Express.js.

// Route not found handler
app.use((req, res, next) => {
  const error = new Error('Route not found');
  error.status = 404;
  next(error);
});

// Error handling middleware
app.use((err, req, res, next) => {
  const statusCode = err.status || 500;
  res.status(statusCode).json({
    error: {
      status: statusCode,
      message: err.message
    }
  });
});

В этом примере мы определяем два ПО промежуточного слоя для обработки ошибок, используя метод app.use().

Первое промежуточное ПО для обработки ошибок — это обработчик ненайденных маршрутов, который перехватывает запросы, не соответствующие каким-либо маршрутам, определенным в нашем приложении. Он просто отправляет клиенту ответ об ошибке Route not found.

Второй — промежуточное ПО для обработки ошибок, которое принимает четыре аргумента: err, req, res и next. Если какое-либо промежуточное ПО или обработчик маршрута обнаруживает ошибку и вызывает next(err), будет выполнено это промежуточное ПО для обработки ошибок. Внутри промежуточного программного обеспечения обработки ошибок мы можем зарегистрировать ошибку и отправить соответствующий ответ об ошибке клиенту, используя метод res.status().json().

Организация маршрутов и контроллеров

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

Давайте создадим папку routes в корне нашего проекта и создадим отдельный файл для каждого маршрута. Например, мы можем создать файл users.js внутри папки routes для обработки всех маршрутов, связанных с пользователем. В файле users.js мы можем определить маршруты и соответствующие им обработчики с помощью Express.js.

// routes/users.js

const express = require('express');
const router = express.Router();

// GET /api/users
router.get('/', (req, res) => {
  // Logic to handle GET request for all users
});

// GET /api/users/:id
router.get('/:id', (req, res) => {
  // Logic to handle GET request for a specific user
});

// POST /api/users
router.post('/', (req, res) => {
  // Logic to handle POST request for creating a new user
});

// PUT /api/users/:id
router.put('/:id', (req, res) => {
  // Logic to handle PUT request for updating a user
});

// DELETE /api/users/:id
router.delete('/:id', (req, res) => {
  // Logic to handle DELETE request for deleting a user
});

module.exports = router;

В этом примере мы используем функцию express.Router() для создания объекта маршрутизатора, который мы можем использовать для определения наших маршрутов. Затем мы определяем наши маршруты, используя объект маршрутизатора, как мы это делали в нашем основном файле приложения. Наконец, мы экспортируем объект маршрутизатора, чтобы использовать его в нашем основном файле приложения.

Мы также можем создать отдельные контроллеры для каждого маршрута, чтобы управлять бизнес-логикой нашего приложения. Например, мы можем создать файл usersController.js внутри папки controllers и определить функции для каждого обработчика маршрута. Затем мы можем потребовать и использовать эти функции контроллера в наших обработчиках маршрутов.

// controllers/usersController.js

// Function to handle GET request for all users
exports.getAllUsers = (req, res) => {
  // Logic to handle GET request for all users
};

// Function to handle GET request for a specific user
exports.getUserById = (req, res) => {
// Logic to handle GET request for a specific user
};

// Function to handle POST request for creating a new user
exports.createUser = (req, res) => {
// Logic to handle POST request for creating a new user
};

// Function to handle PUT request for updating a user
exports.updateUserById = (req, res) => {
// Logic to handle PUT request for updating a user
};

// Function to handle DELETE request for deleting a user
exports.deleteUserById = (req, res) => {
// Logic to handle DELETE request for deleting a user
};

В наших обработчиках маршрутов теперь мы можем просто вызывать эти функции контроллера и передавать объекты req и res в качестве аргументов для обработки бизнес-логики нашего приложения. Такое разделение задач делает нашу кодовую базу более удобной в сопровождении и масштабируемой.

Дополнительные советы и рекомендации

Использовать переменные среды

Рекомендуется использовать переменные среды для хранения конфиденциальной информации, такой как ключи API, учетные данные базы данных и другие параметры конфигурации. Это помогает обеспечить безопасность конфиденциальной информации и позволяет легко вносить изменения в конфигурацию без изменения кода. Вы можете использовать объект process.env в Node.js для доступа к переменным среды.

// Example of using environment variables in Express.js

// Load environment variables from .env file
require('dotenv').config();

// Access environment variables
const apiKey = process.env.API_KEY;
const dbUrl = process.env.DB_URL;

Использовать библиотеку журналов

Ведение журнала является неотъемлемой частью разработки бэкэнда для целей отладки и мониторинга. Вы можете использовать библиотеку журналов, такую ​​как Winston или Morgan, для регистрации важной информации, ошибок и отладочных сообщений в вашем приложении Express.js. Это помогает в устранении неполадок и мониторинге работоспособности вашего приложения.

// Example of using Winston logging library in Express.js

const winston = require('winston');

// Create a logger instance
const logger = winston.createLogger({
  level: 'info', // Log level
  format: winston.format.simple(), // Log format
  transports: [
    // Define log transports (e.g. console, file)
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'error.log', level: 'error' })
  ]
});

// Use the logger in your Express.js middleware or route handlers
app.use((req, res, next) => {
  logger.info(`Request received: ${req.method} ${req.url}`);
  next();
});

// Log an error
logger.error('An error occurred: Internal Server Error');

Используйте расширения и плагины Express.js

Express.js имеет большую экосистему расширений и плагинов. Вы можете найти множество полезных библиотек для аутентификации, проверки, кэширования, сжатия и других распространенных задач. Всегда исследуйте и выбирайте надежные и хорошо поддерживаемые библиотеки для своего проекта.

Практика обработки ошибок

Обработка ошибок — важный аспект разработки бэкенда. Всегда обрабатывайте ошибки изящно и информативно. Используйте соответствующие коды состояния HTTP, предоставляйте осмысленные сообщения об ошибках и регистрируйте ошибки для устранения неполадок. Внимательно относитесь к обработке ошибок, чтобы обеспечить надежное серверное приложение.

Пишите тесты

Написание тестов для вашего приложения Express.js имеет решающее значение для обеспечения его стабильности и корректности. Используйте среды тестирования, такие как Mocha или Jest, для написания модульных тестов, интеграционных тестов и сквозных тестов для ваших маршрутов, промежуточного программного обеспечения и контроллеров. Тестирование помогает выявлять ошибки на ранней стадии и обеспечивает уверенность в надежности вашего приложения.

Защитите свое приложение

Серверные приложения часто имеют дело с конфиденциальными данными и выполняют важные операции. Убедитесь, что ваше приложение соответствует рекомендациям по безопасности. Используйте надлежащие механизмы аутентификации и авторизации, очищайте пользовательский ввод для предотвращения SQL-инъекций и других атак, проверяйте и очищайте данные из внешних источников и используйте HTTPS для безопасного обмена данными. Обновляйте все зависимости, чтобы избежать известных уязвимостей безопасности.

Документируйте свой код

Документирование вашего кода необходимо для удобства обслуживания и совместной работы. Пишите осмысленные комментарии, используйте описательные имена переменных и функций и предоставьте документацию для API и маршрутов. Надлежащая документация помогает другим разработчикам понять ваш код и ускоряет процесс адаптации новых членов команды.

Заключение

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

Благодаря знаниям, полученным из этой статьи, вы сможете стать экспертом в области серверной разработки с помощью Express.js. Не забывайте всегда следовать передовым методам обеспечения безопасности, производительности и удобства обслуживания при разработке серверных приложений. Сохраняйте свой код модульным, тестируемым и хорошо документированным.

Будьте в курсе последних версий Express.js и его зависимостей и активно участвуйте в активном сообществе разработчиков Express.js для постоянного обучения и совершенствования.

Это все, что касается подробного руководства по разработке бэкэнда с помощью Express.js.

Я надеюсь, что после прочтения этой статьи вы научитесь использовать ExpressJS в своих бэкэнд-проектах. 🚀

Если вы нашли эту статью полезной, вы можете получить доступ к похожим, подписавшись на Medium-членство по моей реферальной ссылке

Подпишитесь на меня в Твиттере

Удачного кодирования!

Мелих

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.