Передача переменных в следующее промежуточное ПО с помощью next() в Express.js

Ну, мой вопрос: я хочу передать некоторую переменную из первого промежуточного программного обеспечения в другое промежуточное программное обеспечение, и я попытался сделать это, но было " req.somevariable - это значение как неопределенное".


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

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

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

Ответ 1

Прикрепите вашу переменную к объекту req, а не к res.

Вместо

res.somevariable = variable1;

Есть:

req.somevariable = variable1;

Как уже отмечали другие, res.locals - это рекомендуемый способ передачи данных через промежуточное ПО.

Ответ 2

Это то, для чего предназначен объект 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();
});

Ответ 3

Я не думаю, что лучшая практика будет передавать переменную, как req.YOUR_VAR. Возможно, вы захотите рассмотреть req.YOUR_APP_NAME.YOUR_VAR или req.mw_params.YOUR_VAR.

Это поможет вам избежать перезаписи других атрибутов.

Ответ 4

Это потому, что req и res - это два разных объекта.

Вам нужно искать свойство на том же объекте, в котором вы его добавили.

Ответ 5

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

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
}

Ответ 6

Как уже упоминалось выше, res.locals - хороший (рекомендуемый) способ сделать это. Смотрите здесь для быстрого обучения о том, как сделать это в Express.