Передача переменных в следующее промежуточное ПО с помощью 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.