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

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

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

Чтобы сделать написание и чтение асинхронного кода более простым и элегантным, NodeJS представил синтаксический сахар async/await. Используя ключевые слова async и await, async/await позволяет вам писать асинхронный код, как если бы он был синхронным. Выражение await останавливает выполнение асинхронной функции до тех пор, пока обещание не будет выполнено или отклонено. Асинхронная функция возвращает обещание.

Скажем, например, что у вас есть функция, которая:

function fetchData(url) {
 return new Promise((resolve, reject) => {
 request(url, (error, response, body) => {
 if (error) {
 reject(error);
 } else {
 resolve(body);
 }
 });
 });
}

Вы можете использовать эту функцию в асинхронной функции с ожиданием:

async function getData() {
 try {
 const data = await fetchData(“https://example.com/api");
 console.log(data);
 } catch (error) {
 console.error(error);
 }
}

Таким образом, вы можете избежать использования обратных вызовов или обещаний цепочки и обрабатывать ошибки с помощью блоков try/catch.

Вы также можете использовать async/await с промежуточным ПО и маршрутами ExpressJS. Например, предположим, что у вас есть промежуточное ПО, которое проверяет, аутентифицирован ли пользователь:

function isAuthenticated(req, res, next) {
 if (req.session.user) {
 next();
 } else {
 res.status(401).send(“Unauthorized”);
 }
}

Вы можете использовать это промежуточное ПО в обработчике асинхронного маршрута с ожиданием:

app.get(“/profile”, isAuthenticated, async (req, res) => {
 try {
 const user = await User.findById(req.session.user.id);
 res.json(user);
 } catch (error) {
 res.status(500).send(“Server error”);
 }
});

Таким образом, вы можете упростить логику маршрутизации и обрабатывать ошибки с помощью блоков try/catch.

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

Существуют различные функции промежуточного программного обеспечения, интегрированные с ExpressJS, в том числе express.json(), express.urlencoded(), express.static() и т. д. В модулях npm также доступны сторонние функции промежуточного программного обеспечения, такие как cors(), шлем(), morgan() и т. д. Для ваших конкретных требований вы даже можете разработать собственное промежуточное программное обеспечение.

В качестве иллюстрации предположим, что вы хотите разработать промежуточное программное обеспечение, которое записывает метод запроса, URL-адрес и время:

function logger(req, res, next) {
 console.log(`${req.method} ${req.url} ${Date.now()}`);
 next();
}

Вы можете использовать это промежуточное ПО в своем приложении или объекте маршрутизатора:

app.use(logger);

Каждый запрос будет записан промежуточным программным обеспечением регистратора, прежде чем будет передан следующему промежуточному программному обеспечению или обработчику маршрута таким образом.

Чтобы повысить гибкость и возможность повторного использования вашего промежуточного программного обеспечения, вы также можете использовать параметры. Например, вы хотите создать промежуточное ПО, которое проверяет тело запроса на соответствие схеме с помощью модуля joi:

function validate(schema) {
 return (req, res, next) => {
 const { error } = schema.validate(req.body);
 if (error) {
 res.status(400).send(error.message);
 } else {
 next();
 }
 };
}

Вы можете использовать это промежуточное ПО в своих маршрутах с различными схемами:

const userSchema = joi.object({
 name: joi.string().required(),
 email: joi.string().email().required(),
 password: joi.string().min(8).required(),
});
app.post(“/users”, validate(userSchema), (req, res) => {
 // create user
});
const postSchema = joi.object({
 title: joi.string().required(),
 content: joi.string().required(),
 author: joi.string().required(),
});
app.post(“/posts”, validate(postSchema), (req, res) => {
 // create post
});

Таким образом, вы можете проверять разные тела запросов с разными схемами, используя одну и ту же промежуточную функцию.

Маршрутизация
Еще одной важной функцией ExpressJS является система маршрутизации. Маршрутизация относится к тому, как приложение отвечает на различные запросы в зависимости от метода запроса и URL-адреса. Используя объекты приложения или маршрутизатора и методы HTTP (получение, отправка, удаление, удаление и т. д.), ExpressJS предлагает простой и элегантный подход к построению маршрутов.

Например, вы хотите разработать маршрут, который отвечает на корневой URL-адрес запросом GET «Hello World»:

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

Вы также можете использовать параметры в маршрутах для получения динамических значений из URL-адресов. Например, вы хотите создать маршрут, который отвечает именем пользователя на запрос GET к /users/:name:

app.get(“/users/:name”, (req, res) => {
 const name = req.params.name;
 res.send(`Hello ${name}`);
});

Вы также можете использовать строку запроса в своем маршруте, чтобы получить необязательное значение из URL-адреса. Например, вы хотите создать маршрут, который отвечает именем пользователя и возрастом на запрос GET к /users?name=alice&age=25:

app.get(“/users”, (req, res) => {
 const name = req.query.name;
 const age = req.query.age;
 res.send(`Hello ${name}, you are ${age} years old`);
});

Вы также можете использовать регулярные выражения в своих маршрутах для сопоставления сложных шаблонов в URL-адресах. Например, вы хотите создать маршрут, который отвечает именем файла и расширением на запрос GET к /files/:file(\w+).(\w+):

app.get(“/files/:file(\\w+).(\\w+)”, (req, res) => {
 const file = req.params.file;
 const ext = req.params.ext;
 res.send(`You requested ${file}.${ext}`);
});

Вы также можете использовать маршрутизатор для модуляции ваших маршрутов и организации их в отдельные файлы. Например, вы хотите создать маршрутизатор для маршрута /posts:

// posts.js
const express = require(“express”);
const router = express.Router();
router.get(“/”, (req, res) => {
 // get all posts
});
router.post(“/”, (req, res) => {
 // create a post
});
router.get(“/:id”, (req, res) => {
 // get a post by id
});
router.put(“/:id”, (req, res) => {
 // update a post by id
});
router.delete(“/:id”, (req, res) => {
 // delete a post by id
});
module.exports = router;

Вы можете использовать этот маршрутизатор в своем объекте приложения:

// app.js
const express = require(“express”);
const app = express();
const postsRouter = require(“./posts”);
app.use(“/posts”, postsRouter);
app.listen(3000);

Таким образом, вы можете разделить свои маршруты на разные файлы и сделать свой код более организованным и удобным для сопровождения.

Сильные технологии веб-разработки, такие как NodeJS и ExpressJS, предоставляют множество передовых функций и методологий, которые помогут вам стать более опытным и продуктивным. В этом посте мы рассмотрим несколько из этих передовых методов NodeJS, включая async/await, промежуточное ПО и маршрутизацию, с помощью ExpressJS. Мы надеемся, что этот пост помог вам лучше понять, как использовать эту стратегию в ваших проектах, и вдохновил вас на это.

Вы можете просмотреть официальную документацию или некоторые онлайн-классы и учебные пособия, доступные в Интернете, если хотите узнать больше о NodeJS и ExpressJS. Удачного кодирования!