Передача змінних до наступного середнього програмного забезпечення за допомогою next () у Express.js


200

Ну, моє запитання: я хочу передати певну змінну від першого середнього програмного забезпечення до іншого, і я спробував це зробити, але " req.somevariableбуло задано як" невизначено ".


//app.js
..
app.get('/someurl/', middleware1, middleware2)
...

////middleware1
...
some conditions
...
res.somevariable = variable1;
next();
...

////middleware2
...
some conditions
...
variable = req.somevariable;
...

Треба працювати. Якщо це не помилка в питанні, ви, ймовірно, не вдається, оскільки ви присвоюєте це значення resсередній програмі1 і намагаєтеся отримати його з середнього reqпрограмного забезпечення2.
Андреас Хультгрен

Thanksz @AndreasHultgren
користувач2791897

Local variables are available in middleware via req.app.locals expressjs.com/pt-br/api.html#app.locals
Ронні Ройстон

Відповіді:


202

Не додайте змінну до reqоб'єкта, а не res.

Замість

res.somevariable = variable1;

Мають:

req.somevariable = variable1;

Як зазначали інші, res.localsце рекомендований спосіб передачі даних через програмне забезпечення.


13
використовувати res.locals.variable = var; дивіться іншу відповідь
godzsa

1
щоб отримати змінну, використовуйте req.res.locals.variable у наступній функції програмного забезпечення
Вільям Ву

3
@WilliamWu його res.locals, ні req.res.locals.
Чемберлен

2
res.locals.myVarце шлях.
jasonseminara

447

Для цього призначений об’єкт res.locals . Встановлення змінних безпосередньо на об’єкт запиту не підтримується і не задокументоване. res.locals гарантовано зберігає стан протягом життя запиту.

res.locals

Об'єкт, що містить локальні змінні відповіді, підходив до запиту і тому доступний лише представленням, що надаються під час циклу запиту / відповіді (якщо такі є). В іншому випадку ця властивість ідентична app.locals.

Це властивість корисно для викриття інформації на рівні запиту, такої як назва шляху запиту, автентифікований користувач, налаштування користувача тощо.

app.use(function(req, res, next) {
    res.locals.user = req.user;  
    res.locals.authenticated = !req.user.anonymous;
    next();
});

Щоб отримати змінну в наступному середньому програмному забезпеченні:

app.use(function(req, res, next) {
    if (res.locals.authenticated) {
        console.log(res.locals.user.id);
    }
    next();
});

66
Не знаю , чому це не загальноприйнятий відповідь, це документовані спосіб установки змінних з проміжного програмного забезпечення по всьому запитом.
Сем Холмс

11
Res.locals призначений для використання в представленнях, які в кінцевому підсумку надаються протягом життєвого циклу запиту. Про це йдеться в документації. Якщо ви не використовуєте погляди, надмірно розміщувати речі на об’єкті місцевих жителів, і це не умова. У цих випадках я прагну заохочувати людей дотримуватися конвенції, щоб ми могли знизити когнітивне навантаження під час вивчення таких понять, як «Експрес» або прохання життєвих циклів.
real_ate

2
@real_ate - це основне використання res.locals, однак це не стосується питань ОП. Передача загальних змінних запитів майбутнім середнім програмним забезпеченням іноді є необхідністю, час, коли я його з'являвся, як правило, стосується автентифікації користувача в ранньому середньому програмному забезпеченні, яке встановлює претензії, що надсилаються в середньому програмному забезпеченні нижче.
cchamberlain

14
Експрес-документація для написання проміжного програмного забезпечення встановлює змінні на reqоб’єкт expressjs.com/en/guide/writing-middleware.html . Подивіться на розділMiddleware function requestTime
Сом

2
@goonerify thats на щастя не так, як працює реакція. Відповіді передаються за допомогою виклику функціональної властивості об'єкта відповіді, такого як res.json({})тощо res.locals, доступний лише на задній панелі впродовж терміну дії запиту. expressjs.com/en/5x/api.html
cchamberlain

22

Я не думаю, що найкраща практика буде передавати подібну змінну req.YOUR_VAR. Ви можете розглянути req.YOUR_APP_NAME.YOUR_VARабо req.mw_params.YOUR_VAR.

Це допоможе вам уникнути перезапису інших атрибутів.

Оновлення 31 травня 2020 року

res.locals - це те, що ви шукаєте, об'єкт підпадає під запит.

Об'єкт, що містить локальні змінні відповіді, підходив до запиту і тому доступний лише представленням, що надаються під час циклу запиту / відповіді (якщо такі є). В іншому випадку ця властивість ідентична app.locals.

Це властивість корисно для викриття інформації на рівні запиту, такої як назва шляху запиту, автентифікований користувач, налаштування користувача тощо.


2
Як ви пропонуєте встановити req.YOUR_APP_NAME = {}спочатку? Ви просто спробуйте написати, req.YOUR_APP_NAME.someVarви отримаєте помилку, яка req.YOUR_APP_NAMEще не визначена.
Куша

2
@Kousha Ви можете писати посередництво маршрутизатора у верхній частині сценарію маршрутизації:router.use(function(req,res,next){req.YOUR_APP_NAME = {};next()})
Томаш

чи є спосіб передати його як парам з наступною () функцією? як наступний (myObj)
philx_x

1
@Kousha - Ваша невизначена помилка не має нічого спільного з експресом, ви намагаєтеся призначити властивість об'єкту, який не існує. Зазвичай для цього ви б скористалися req.APP_NS = req.APP_NS || {}; req.APP_NS.somevar = 'value'.
Чемберлен

1
@philx_x, якщо ви передаєте будь-який параметр у nextфункцію, він запустить експрес-оброблювач помилок і випаде . перевірити документи.
Мерль

7

Це тому , що reqі resдва різних об'єкта.

Потрібно шукати властивість у тому самому об’єкті, до якого ви додали його.


3

Трюк досить простий ... Цикл запитів все ще дуже живий. Ви можете просто додати нову змінну, яка створить тимчасову, що викликає

app.get('some/url/endpoint', middleware1, middleware2);

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

(req, res, next) => {
    var yourvalue = anyvalue
}

У програмі 1 ви керуєтесь своєю логікою і зберігаєте своє значення, як показано нижче:

req.anyvariable = yourvalue

У середньому програмному забезпеченні 2 ви можете зафіксувати це значення з програмного забезпечення 1, зробивши наступне:

(req, res, next) => {
    var storedvalue = req.yourvalue
}

1

Як було сказано вище, res.locals - хороший (рекомендований) спосіб зробити це. Дивіться тут короткий підручник про те, як це зробити в Express.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.