---
id: 587d7fb1367417b2b2512bf3
title: Імплементація проміжного ПЗ для реєстраційного запиту кореневого рівня
challengeType: 2
forumTopicId: 301514
dashedName: implement-a-root-level-request-logger-middleware
---

# --description--

Раніше ви ознайомились з функцією проміжного ПЗ `express.static()`. А зараз саме час детальніше розглянути, що таке проміжне ПЗ. Функції проміжного програмного забезпечення – це функції, які приймають 3 аргументи: об'єкт запиту, об'єкт відповіді й наступну функцію циклу «запит-відповідь» додатку. Ці функції виконують певний код, який може мати побічний ефект на додаток і зазвичай додають інформацію до об'єктів запиту чи відповіді. Ще вони можуть закінчити цикл, надіславши відповідь, коли стикаються з певними умовами. Якщо після завершення вони не надсилають відповідь, то починають виконувати наступну функцію в стеку. Це запускає третій аргумент – `next()`.

Розглянемо наступний приклад:

```js
function(req, res, next) {
  console.log("I'm a middleware...");
  next();
}
```

Припустимо, ви приєднати цю функцію до маршруту. Коли запит збігається з маршрутом, відображається рядок «I’m a middleware…», а потім виконується наступна функція в стеку. У цій вправі ви створите проміжне ПЗ кореневого рівня. Як ви бачили в завданні 4, щоб встановити функцію проміжного ПЗ на кореневому рівні, ви можете скористатись методом `app.use(<mware-function>)`. У такому випадку ця функція виконається для всіх запитів, але ви також можете встановити конкретніші умови. Наприклад, якщо ви хочете виконати функцію лише для запитів POST, можна скористатись `app.post(<mware-function>)`. Аналогічні методи існують для всіх дієслів HTTP (GET, DELETE, PUT, …).

# --instructions--

Створіть звичайний реєстратор. Для кожного запиту в консолі має записуватись рядок в наступному форматі: `method path - ip`. Приклад виглядатиме так: `GET /json - ::ffff:127.0.0.1`. Зверніть увагу, що між `method` і `path` є пробіл, і що дефіс, який розділяє `path` та `ip`, виділено пробілами з обох сторін. Ви можете отримати метод запиту (дієслово http), відносний шлях маршруту й ip абонента з об'єкта запиту, використавши `req.method`, `req.path` та `req.ip`. Коли закінчите, не забудьте викликати `next()`, бо інакше ваш сервер заблокується назавжди. Обов'язково відкрийте «Logs» і подивіться, що відбувається, коли надходять певні запити.

**Примітка:** Express оцінює функції в тому ж порядку, в якому вони з'являються у коді. Це стосується й проміжного ПЗ. Якщо ви хочете, щоб це працювало для всіх маршрутів, встановіть його перед ними.

# --hints--

Проміжне ПЗ для реєстраційного запиту кореневого рівня повинне бути активним

```js
(getUserInput) =>
  $.get(getUserInput('url') + '/_api/root-middleware-logger').then(
    (data) => {
      assert.isTrue(
        data.passed,
        'root-level logger is not working as expected'
      );
    },
    (xhr) => {
      throw new Error(xhr.responseText);
    }
  );
```

# --solutions--

```js
/**
  Backend challenges don't need solutions, 
  because they would need to be tested against a full working project. 
  Please check our contributing guidelines to learn more.
*/
```
