Я давно хотел внести свой вклад в сообщество программистов, но на самом деле не нашел подходящего способа. Между работой на полную ставку, побочными проектами и просмотром 24 в первый раз я не участвовал в проекте с открытым исходным кодом, как я хотел, и решил вместо этого внести свой вклад в эту серию. Долгое время я использовал статьи с таких сайтов, как Medium, чтобы узнать обо всем и обо всем. Лучшие статьи, кажется, сосредоточены на одном или двух пунктах и ​​дают глубокое погружение в полное понимание концепций. Пришло время поделиться своими знаниями, в частности, вытекающими из NodeJS (отсюда и название). Так…

Что, черт возьми, происходит с «Now You Node» и что это означает?

В основном я просто пытаюсь быть умным, но на самом деле я хочу предоставить читателям реальную ценность за 15 минут или меньше. Нет ничего хуже, чем пытаться учиться, пока писатель накапливает четыре или более концепции, а вы просто хотите выучить одну. Now You Node будет ориентироваться на одну концепцию для каждой статьи и следить за тем, чтобы вы могли перевести ее в разработку после прочтения.

Чтобы понять эту серию, вам потребуется базовое понимание javascript и NodeJS. Я расскажу о некоторых базовых в качестве напоминания, но эта серия не для людей, которые никогда не использовали эти инструменты!

А теперь перейдем к делу. Представляем первый модуль npm: Polka.

Полька

Как вы думаете, что он делает, когда вы слышите «польку» в качестве имени модуля npm? Конечно, мы слышали о танце, но как это соотносится с модулем npm? Если вы думаете, что это веб-сервер (а я не знаю, почему вы так думаете), то вы правы! Polka - это чрезвычайно минимальная, высокопроизводительная альтернатива Express.js *. Это дает вам минимум, необходимый для вашего http-сервера, и позволяет вам добавлять свои собственные начинки. Polka идеально подходит для небольших простых API-интерфейсов, но также может быть адаптирована для более сложных сценариев.

Для начала:

npm i polka

Совет: если вы используете npm ≥ 5, вам больше не нужно использовать параметр --save, поскольку он установлен по умолчанию!

Если вы знакомы с Express.js, вы уже знаете, как использовать польку, но если вы создаете свой первый http-сервер с помощью NodeJS, вам не о чем беспокоиться. Начнем с очень простого случая.

const polka = require('polka');
const server = polka();
server.get('/', (req, res) => {
    res.end('Hello World');
});
server.listen(3000).then(() => {
    console.log('Server is running at https://localhost:3000');
});

Подожди, вот и все? Да! У нас есть простой сервер с одной конечной точкой, которая возвращает "Hello World". Что происходит, когда у нас есть такие параметры, как идентификатор пользователя?

server.get('/users/:id', (req, res) => {
    res.end('Your user id is: ' + req.params.id);
});

Отлично, но что, если мне нужно аутентифицировать пользователей, прежде чем им будет разрешен доступ к информации… Войдите в промежуточное ПО! Промежуточное ПО позволяет нам выполнять задачи по запросу в гарантированном порядке. Вам необходимо зарегистрировать промежуточное ПО перед маршрутами. Итак, над вашим «/ users /: id» введите:

server.use((req, res, next) => {
    const token = req.headers['authorization'];
    const isValid = someFunctionToValidateToken(token);
    if(!isValid) {
        next(new Error('Invalid token!'));
    }
    next();
});

Функции промежуточного программного обеспечения имеют функцию next, которая сообщает польке, следует ли продолжать, или вернуть ошибку в конечную точку. Но что, если у нас есть общедоступные конечные точки и безопасные конечные точки? Мы можем извлечь функцию промежуточного программного обеспечения для повторного использования:

authenticate = (req, res, next) => {
    const token = req.headers['authorization'];
    const isValid = someFunctionToValidateToken(token);
    if(!isValid) {
        next(new Error('Invalid token!'));
    }
    next();
};
server.use(authenicate); // every request will run the function

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

// Pattern matching, match every POST request
server.post('*', (req, res, next) => {
    const token = req.headers['authorization'];
    const isValid = someFunctionToValidateToken(token);
    if(!isValid) {
        next(new Error('Invalid token!'));
    }
    next();
});
// Request Handlers
server.get('/users/:id', authenticate, (req, res) => {
    res.end('Your user id is: ' + req.params.id);
});

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

server.get('/users/:id', authenticate, doSomething, doSomethingElse, doOneMoreThing, (req, res) => {
    res.end('Your user id is: ' + req.params.id);
});

Это позволяет нам повторно использовать функции там, где это необходимо. Довольно крутая штука!

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

const cors = require('cors');
server.use(cors());

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

Если у вас есть предложения по модулям или концепциям, дайте мне знать! Моя цель - публиковать постоянный поток информации, чтобы вы все время учились. Даже если у вас сейчас нет варианта использования модуля, неплохо было бы узнать что-то новое.

Заявление об ограничении ответственности: никакие организации не платят мне за продвижение какой-либо темы, описанной в этой статье.