Как и в express, мы можем писать собственные промежуточные программы на Koa. Если вы еще не знакомы с функциями промежуточного программного обеспечения, это простые функции, которые мы можем внедрить в цикл запросов и ответов приложения. Промежуточное ПО - это серия функций, которые выполняются одна за другой, что позволяет им получить доступ к контексту koa и при необходимости внести изменения. Когда поступает запрос, вызывается первое промежуточное программное обеспечение. Он получает контекст koa и следующее промежуточное ПО, которое будет выполняться после этого. Это первое промежуточное ПО может затем вызвать следующее. Следующий вызывает следующего. Таким образом, промежуточное программное обеспечение может вызывать друг друга по порядку, чтобы сформировать каскад вызовов функций.

Промежуточное программное обеспечение Koa может использовать синтаксис async await, позволяя промежуточному программному обеспечению await выполнять следующее (и следующее после и одно после этого…), а затем запускать еще несколько кодов, когда они закончат. Например, мы можем написать функцию, которая регистрирует время поступления запроса, запускает следующие промежуточные программы, а затем, когда все они будут завершены и выполнение вернется к самому промежуточному программному обеспечению, оно может выполнить еще несколько операций - измеряя, сколько времени потребовалось закончить все операции.

В Koa маршрутизаторы также реализованы как промежуточное ПО. Пишущие нами обработчики представлений сами по себе являются лишь формой промежуточного программного обеспечения.

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

Написать собственное промежуточное ПО очень просто. Нам нужно написать асинхронную функцию, которая принимает два параметра: контекст koa и следующее промежуточное ПО для ожидания. Внутри этой функции мы можем делать все, что захотим, а затем в какой-то момент мы должны дождаться next промежуточного программного обеспечения. Это запустит следующее промежуточное ПО в цепочке, последовательно идущее вниз по течению. После завершения работы последнего промежуточного программного обеспечения оно начинает возвращаться в исходное состояние, наконец, возвращаясь к нашей функции промежуточного программного обеспечения. Когда эта await next() часть завершается, это означает, что запрос был обработан, и мы можем двигаться дальше. В нашем случае мы записали время входящего запроса, а затем, в конце запроса, записали время, которое потребовалось для обработки этого запроса.

Мы можем добавить новое промежуточное ПО в наше приложение koa с помощью app.use()method.

Порядок исполнения

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

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

First Middleware Started
Second Middleware Started
Returned to second Middleware. Returning to first
Returned to first Middleware. Finishing

Если мы закомментируем ту часть, где мы await next(), она больше не будет вызывать следующие промежуточные программы. Поскольку наш маршрутизатор также реализован как промежуточное ПО, обработчики представлений также не будут работать.

Выход:

First Middleware Started
Returned to first Middleware. Finishing

Внутри промежуточного программного обеспечения мы можем получить полный доступ к контексту koa (и, следовательно, к запросу и ответу).

Промежуточное ПО для каждого маршрута

При использовании koa-router мы также можем добавлять промежуточное ПО только к определенным маршрутам. Например, у нас могут быть защищенные маршруты, где нам нужно проверить токен доступа. Мы можем написать промежуточное ПО и добавлять только защищенные маршруты, а не добавлять в приложение вообще.

Давайте напишем простое промежуточное ПО, которое проверяет параметр запроса pass=123456 и отклоняет запрос, если он отсутствует. Затем мы добавим его перед обработчиком маршрута.

Как только мы это сделаем, если мы зайдем по адресу: http: // localhost: 3000 / - мы получим ошибку:

{
  "error": "No password"
}

Но если мы зайдем по адресу: http: // localhost: 3000 /? Pass = 123456, все будет нормально.

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