Bem, minha pergunta é: eu quero passar alguma variável do primeiro middleware para outro middleware, e tentei fazer isso, mas havia " req.somevariable
é dado como 'indefinido'".
//app.js
..
app.get('/someurl/', middleware1, middleware2)
...
////middleware1
...
some conditions
...
res.somevariable = variable1;
next();
...
////middleware2
...
some conditions
...
variable = req.somevariable;
...
javascript
node.js
express
middleware
next
user2791897
fonte
fonte
res
middleware1 e tenta obtê-loreq
no middleware2.Local variables are available in middleware via req.app.locals
expressjs.com/pt-br/api.html#app.localsRespostas:
Anexe sua variável ao
req
objeto, nãores
.Ao invés de
Ter:
Como outros já apontaram,
res.locals
é a maneira recomendada de passar dados pelo middleware.fonte
res.locals
, notreq.res.locals
.res.locals.myVar
é o caminho a percorrer.É para isso que serve o objeto res.locals . A definição de variáveis diretamente no objeto de solicitação não é suportada ou documentada. É garantido que o res.locals mantém o estado durante a vida útil de uma solicitação.
res.locals
Para recuperar a variável no próximo middleware:
fonte
req
objeto expressjs.com/en/guide/writing-middleware.html . Veja a seçãoMiddleware function requestTime
res.json({})
, etc.,res.locals
está disponível apenas no back-end durante a vida útil da solicitação. expressjs.com/en/5x/api.htmlEu não acho que as melhores práticas passem por uma variável como
req.YOUR_VAR
. Você pode querer considerarreq.YOUR_APP_NAME.YOUR_VAR
oureq.mw_params.YOUR_VAR
.Isso ajudará a evitar a substituição de outros atributos.
Atualização 31 de maio de 2020
res.locals é o que você está procurando, o objeto está no escopo da solicitação.
Um objeto que contém variáveis locais de resposta com escopo definido para a solicitação e, portanto, disponível apenas para as visualizações renderizadas durante esse ciclo de solicitação / resposta (se houver). Caso contrário, essa propriedade é idêntica a app.locals.
Essa propriedade é útil para expor informações no nível da solicitação, como o nome do caminho da solicitação, usuário autenticado, configurações do usuário etc.
fonte
req.YOUR_APP_NAME = {}
inicialmente? Você apenas tenta escrever parareq.YOUR_APP_NAME.someVar
você receberá um erro comoreq.YOUR_APP_NAME
ainda não está definido.router.use(function(req,res,next){req.YOUR_APP_NAME = {};next()})
req.APP_NS = req.APP_NS || {}; req.APP_NS.somevar = 'value'
.next
funcionar, ele acionará o 'manipulador de erros express' e sairá. verifique os documentos.Isso porque
req
eres
são dois objetos diferentes.Você precisa procurar a propriedade no mesmo objeto em que a adicionou.
fonte
O truque é bem simples ... O ciclo de solicitações ainda está vivo. Você pode simplesmente adicionar uma nova variável que criará uma chamada temporária
Como você pode lidar com sua solicitação no primeiro middleware
No middleware 1, você lida com sua lógica e armazena seu valor como abaixo:
No middleware 2, você pode pegar esse valor no middleware 1, fazendo o seguinte:
fonte
Como mencionado acima, res.locals é uma boa maneira (recomendada) de fazer isso. Veja aqui um tutorial rápido sobre como fazer isso no Express.
fonte