58 lines
4.9 KiB
Markdown
58 lines
4.9 KiB
Markdown
![]() |
---
|
|||
|
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()`, бо інакше ваш сервер заблокується назавжди. Обов'язково відкрийте “Журнал“ і подивіться, що відбувається, коли надходять певні запити.
|
|||
|
|
|||
|
**Note:** Вираз оцінює функції в тому ж порядку, в якому вони з'являються в коді. Це стосується й підпрограмного забезпечення. Якщо ви хочете, щоб це працювало для всіх маршрутів, встановіть його перед ними.
|
|||
|
|
|||
|
# --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.
|
|||
|
*/
|
|||
|
```
|