Облегчение жизни за счет сокращения логики копирования и вставки с использованием именованного промежуточного программного обеспечения

Давайте посмотрим на простой пример.

Вы хотите проверить пользователя ROLE (admin, user, viewer, editor, ect) в своем приложении и в определенных Маршрутах.

Конечно, вы можете реализовать эту проверку, вставив строки кода в каждую из ваших функций Контроллера index, show, store, update, etc там, где это необходимо, например:

async index ({ auth }) {
    const user = await auth.getUser();
    if (user.role === 'admin') {
        // do something
    } else {
        // do something
    }
}
async store ({ auth }) {
    const user = await auth.getUser();
    if (user.role === 'editor') {
        // do something
    } else {
        // do something
    }
}
....

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

Есть лучшее решение.

Именованное промежуточное ПО

Основное различие между промежуточным программным обеспечением global и named заключается в том, что в каждом запросе будет использоваться промежуточное программное обеспечение global, но с именем промежуточного программного обеспечения. (auth, например) можно использовать там, где это необходимо.

Route
    .get(`users`, 'UserController.index')
    .middleware('auth')
    .formats(['json']);

И этому промежуточному программному обеспечению также можно передать реквизиты.

Создание именованного промежуточного программного обеспечения

1. Используйте команду интерфейса командной строки adonis.

make:middleware

adonis make:middleware RoleDetector
> Select middleware type (Use arrow keys)
  For HTTP requests
  For Websocket requests
  For both HTTP and Websocket requests

Если вы выберете For HTTP requests, промежуточное ПО будет создано только с функцией handle:

class SomeMiddleware {
    async handle (ctx, next, schema) {
        // do something
        await next();
    }
}

При выборе For Websocket requests будет создано промежуточное ПО с функцией wsHandle с точно таким же кодом.

Как вы понимаете, выбрав For both HTTP and Websocket requests с созданием промежуточного программного обеспечения с обеими функциями.

2. Регистрация

Затем вам необходимо зарегистрировать промежуточное ПО в файле /start/kernel.js, добавив строку пути с вашим собственным именем:

const namedMiddleware = {
    ...
    role: 'App/Middleware/RoleDetector',
};

3. Начните использовать

Давайте создадим простую функцию console.log () в нашем RoleDetector.js файле:

И теперь вы можете начать использовать его в своем приложении с теми маршрутами, которые вам нужны. Давайте посмотрим на пример:

Route
    .resource('addresses', 'AddressController')
    .middleware(new Map([
        [['index'], ['role:admin']],
    ]))
    .apiOnly();

Здесь мы говорим, что хотим использовать созданное нами промежуточное ПО RoleDetector (по имени, которое мы определили в namedMiddleware) и передаем ' admin 'свойство.

Посмотрим на консольный результат:

info: RoleDetector. Role: [ 'admin' ]

Вы можете передать столько свойств, сколько захотите:

.middleware(new Map([
    [['index'], ['role:admin,custom,helloWorld']],
]))

Результатом консоли будет:

info: RoleDetector. Role: [ 'admin', 'custom', 'helloWorld' ]

Если вам понравился этот рассказ, вы можете также проверить Список всех моих рассказов. Удачного кодирования 🎉