NodeJS / Express: o que é "app.use"?

332

Nos documentos para o expressmódulo NodeJS , o código de exemplo possui app.use(...).

Qual é a usefunção e onde é definida?

Alexander Bird
fonte
5
possível duplicado: stackoverflow.com/questions/7337572/…
Alexander Bird
Este tipo de perguntas pode ser respondido lendo a documentação.
Mina
47
a documentação é uma enigmática pouco para um iniciante
KansaiRobot
6
Duplicado possível acima faz referência a outro
Afrig Aminuddin
1
A documentação não é totalmente clara
Tessaracter

Respostas:

370

O objeto do aplicativo é instanciado na criação do servidor Express. Ele possui uma pilha de middleware que pode ser personalizada app.configure()(agora está obsoleta na versão 4.x) .

Para configurar seu middleware, você pode chamar app.use(<specific_middleware_layer_here>)para todas as camadas de middleware que deseja adicionar (pode ser genérico para todos os caminhos ou acionado apenas em caminhos específicos que o servidor manipula) e será adicionado à sua pilha de middleware Express . As camadas de middleware podem ser adicionadas uma a uma em várias invocações de use, ou mesmo todas de uma vez em série com uma invocação. Veja a usedocumentação para mais detalhes.

Para dar um exemplo do entendimento conceitual do Express Middleware, eis a aparência da minha pilha de middleware de aplicativo (app.stack) ao registrar meu objeto de aplicativo no console como JSON:

stack: 
   [ { route: '', handle: [Function] },
     { route: '', handle: [Function: static] },
     { route: '', handle: [Function: bodyParser] },
     { route: '', handle: [Function: cookieParser] },
     { route: '', handle: [Function: session] },
     { route: '', handle: [Function: methodOverride] },
     { route: '', handle: [Function] },
     { route: '', handle: [Function] } ]

Como você pode deduzir, liguei para app.use(express.bodyParser()), app.use(express.cookieParser())etc, que adicionou essas 'camadas' expressas do middleware à pilha de middleware. Observe que as rotas estão em branco, o que significa que, quando adicionei essas camadas de middleware, especifiquei que elas seriam acionadas em qualquer rota. Se eu adicionasse uma camada de middleware personalizada /user/:idque seria acionada apenas no caminho que seria refletido como uma sequência no routecampo desse objeto da camada de middleware na impressão da pilha acima.

Cada camada está basicamente adicionando uma função que lida especificamente com algo no seu fluxo através do middleware.

Por exemplo, adicionando bodyParser, você garante que o servidor lide com as solicitações recebidas por meio do middleware expresso . Portanto, agora analisar o corpo das solicitações recebidas faz parte do procedimento que seu middleware executa ao lidar com solicitações recebidas - tudo porque você ligou app.use(bodyParser).

chinnychinchin
fonte
116
obrigado. seria tão difícil para o pessoal expresso explicar isso em seus documentos da API?
ericsoco
4
Então, você está dizendo que, quando uma solicitação é recebida, os dados são passados ​​por esses analisadores antes de atingir o serviço real. Por exemplo, por exemplo: Solicitação válida-> Autenticação-> ProcessesRequest-> ServResponse O USE controlaria essas etapas em uma ordem específica e não as executaria paralelamente?
Adam Hess
2
Então, a injeção de dependência app.use () está em ação?
Kevin C.
8
Quando é chamada a função que é enviada para app.use? Depois de criar o servidor expresso ou para cada solicitação?
Timo Huovinen
5
@KevinC. Não, não é injeção de dependência. É uma arquitetura de plug-in. Geralmente esse tipo de arquitetura é chamado de sistema de filtro / tubulação de filtro / tubulação e filtro. No Express, o canal é o next()retorno de chamada que cada middleware deve chamar para passar o processamento para a próxima função no pipeline. O sistema de roteamento (o primeiro argumento para app.use()) permite que o gasoduto em galho dependendo URL
slebetman
50

useé um método para configurar o middleware usado pelas rotas do objeto do servidor HTTP Express. O método é definido como parte do Connect em que o Express se baseia.

Atualização A partir da versão 4.x, o Express não depende mais do Connect .

As funções de middleware que foram incluídas anteriormente no Express agora estão em módulos separados; veja a lista de funções de middleware .

JohnnyHK
fonte
3
E os documentos on-line estão aqui: senchalabs.org/connect/proto.html#app.use
Alexander Bird Alexander
Seria eficiente se um middleware do Nó instanciar objetos? Isso significaria que, a cada solicitação, esse middleware instancia novos objetos? Os objetos antigos são descartados? Por exemploapp.use(function(){ var object = new SomeConstructor; next(); })
CMCDragonkai
1
@CMCDragonkai Não há problema em instanciar objetos em cada solicitação. Eles serão coletados como lixo, desde que você não esteja armazenando referências aos objetos fora do escopo do manipulador de solicitações.
224156 jeff_mcmahan
1
@AlexanderBird thx para os links (o primeiro está quebrado agora). Para o registro, apenas o início do documento no 2º link diz "Utilize o identificador do middleware fornecido para a rota especificada, com o padrão /. Essa" rota "é o ponto de montagem do middleware, quando recebe um valor diferente de / o middleware só é efetivo quando esse segmento está presente no nome do caminho da solicitação.Por exemplo, se montássemos uma função em / admin, ela seria invocada em / admin e / admin / settings, no entanto, não seria invocada para / , ou / postagens ". Simple :)
Adrien Seja
40

Cada app.use (middleware) é chamado toda vez que uma solicitação é enviada ao servidor.

Tyrese
fonte
7
Sua resposta em uma única frase é instantaneamente compreensível e mais útil do que as outras explicações com vários parágrafos.
stackedAndOverflowed
16

app.use () usado para Montar a função middleware ou montar em um caminho especificado, a função middleware é executada quando o caminho base corresponde.

Por exemplo: se você estiver usando app.use () em indexRouter.js, assim:

//indexRouter.js

var adsRouter = require('./adsRouter.js');

module.exports = function(app) {
    app.use('/ads', adsRouter);
}

No código acima app.use () monte o caminho em '/ ads' para adsRouter.js.

Agora em adsRouter.js

// adsRouter.js

var router = require('express').Router();
var controllerIndex = require('../controller/index');
router.post('/show', controllerIndex.ads.showAd);
module.exports = router;

em adsRouter.js, o caminho será assim para ads- '/ ads / show' e, em seguida, funcionará de acordo com controllerIndex.ads.showAd ().

app.use ([caminho], retorno de chamada, [retorno de chamada]): podemos adicionar um retorno de chamada ao mesmo.

app.use('/test', function(req, res, next) {

  // write your callback code here.

    });
Shubham Verma
fonte
Eu usaria "map" no lugar de "mount", mais fácil de entender.
Jeb50
13

app.use () atua como um middleware em aplicativos expressos. Ao contrário de app.get () e app.post () , você pode realmente usar app.use () sem especificar o URL da solicitação. Nesse caso, o que faz é executado todas as vezes, independentemente do URL que foi atingido.

Omkar Mote
fonte
7

app.use () funciona assim:

  1. Evento de solicitação acionado na instância do servidor http do nó.
  2. express faz parte de sua manipulação interna com req object.
  3. É quando o Express começa a fazer as coisas que você especificou com app.use

que muito simples.

E somente então o Express fará o resto das coisas, como roteamento.

Anton Stafeyev
fonte
6
app.use(function middleware1(req, res, next){
   // middleware1 logic
}, function middleware1(req, res, next){
   // middleware2 logic
}, ... middlewareN);

app.use é uma maneira de registrar middleware ou cadeia de middlewares (ou vários middlewares) antes de executar qualquer lógica de rota final ou lógica de rota intermediária, dependendo da ordem da sequência de registro do middleware.

Middleware: forma uma cadeia de funções / funções de middleware com 3 parâmetros req, res e next . next é o retorno de chamada, que se refere à próxima função de middleware em cadeia e, no caso da última função de middleware em cadeia, aponta para a primeira função de middleware da próxima cadeia intermediária registrada.

JackOfAshes - Mohit Gawande
fonte
1
Funciona como um encanto !!
Anmol Rai
3

Em express, se importarmos express de "express" e usarmos app = express (); então aplicativo com todas as funcionalidades do express

se usarmos app.use ()

com qualquer função de módulo / middleware para usar em todo o projeto expresso

saurabh kumar
fonte
3

app.useé uma função requer middleware. Por exemplo:

 app.use('/user/:id', function (req, res, next) {
       console.log('Request Type:', req.method);
        next();
     });

Este exemplo mostra a função de middleware instalada no /user/:idcaminho. Esta função é executada para qualquer tipo de solicitação HTTP no /user/:idcaminho.

É semelhante ao Servidor da Web REST, basta usar diferente /xxpara representar ações diferentes.

Hongnan Yan
fonte
obrigado pela resposta, mas como alguém já disse todas essas informações, não vou votar novamente. Acho que não preciso de todas as explicações sobre o que o expresso usepode fazer; Eu só precisava saber o que era (e qualquer conhecimento de contexto para saber como pesquisar mais).
Alexander Bird
3

app.use é woks como middleware para solicitação de aplicativo. sintaxe

app.use('pass request format',function which contain request response onject)

exemplo

app.use('/',funtion(req,res){
 console.log(all request pass through it);
// here u can check your authentication and other activities.
})

Também você pode usá-lo no caso de encaminhar sua solicitação.

app.use('/', roting_object);
chetan awate
fonte
2

Middleware é um termo geral para software que serve para "colar", de modo que app.use é um método para configurar o middleware, por exemplo: para analisar e manipular o corpo da solicitação: app.use (bodyParser.urlencoded ({extended: true })); app.use (bodyParser.json ()); existem muitos middlewares que você pode usar em seu aplicativo expresso, basta ler o documento: http://expressjs.com/en/guide/using-middleware.html

user3432221
fonte
2

app.use aplica o middleware especificado à pilha principal de aplicativos. Ao anexar o middleware à pilha principal de aplicativos, a ordem do anexo é importante; se você anexar o middleware A antes do middleware B, o middleware A sempre será executado primeiro. Você pode especificar um caminho ao qual um middleware específico é aplicável. No exemplo abaixo, "olá mundo" será sempre registrado antes de "boas festas".

const express = require('express')
const app = express()

app.use(function(req, res, next) {
  console.log('hello world')
  next()
})

app.use(function(req, res, next) {
  console.log('happy holidays')
  next()
})
Rubin bhandari
fonte
2

Ele permite que você use qualquer middleware ( leia mais ) como body_parser, CORSetc. Middleware pode fazer alterações requeste responseobjetos. Também pode executar um pedaço de código.

Binayak Gouri Shankar
fonte
Obrigado pela resposta, mas acredito que toda essa informação já é capturado em outras respostas
Alexander Ave
2

Você também pode criar sua própria função de middleware como

app.use( function(req, res, next) {
  // your code 
  next();
})

Ele contém três parâmetros req, res, next
Você também pode usá-lo para autenticação e validação de parâmetros de entrada para manter seu controlador limpo.

next()é usado para ir para o próximo middleware ou rota.
Você pode enviar a resposta do middleware

Ashvin Ahjolia
fonte
1

Vincule o middleware no nível do aplicativo a uma instância do objeto do aplicativo usando as funções app.use () e app.METHOD (), em que METHOD é o método HTTP da solicitação que a função do middleware manipula (como GET, PUT ou POST) em minúsculas.

Rajeev Kumar Verma
fonte
1

Resumindo, app.use () suporta todos os tipos de solicitações [por exemplo: get, post, ...], então é usado principalmente para configurar o middelware. ou pode ser usado para quando as rotas e funções separadas

exemplo:

app.use("/test",functionName)

e functionName está localizado em um arquivo diferente

Snivio
fonte
Obrigado pela resposta, mas acredito que todas essas informações já foram capturadas em outras respostas.
Alexander Bird
1

app.use() é um método de middleware.

O método de middleware é como um interceptador em java, esse método sempre é executado para todas as solicitações.

Objetivo e uso do middleware: -

  1. Para verificar se a sessão expirou ou não
  2. para autenticação e autorização de usuário
  3. verifique se há cookie (data de validade)
  4. analisar dados antes da resposta
Mohan
fonte
Middleware é a função passada para app.use ().
NattyC
1

app.use
é criado pelo express (framework do middleware nodejs)
app.use é usado para executar qualquer consulta específica no processo de
fertilização server.js (nó)
var app = require ('express'); então a função basicamente app.use é chamada sempre que o servidor é ativado
app.use(bodyparser.json())

Piyush Jain
fonte
0

app.use é um middleware em nível de aplicativo

Vincule o middleware no nível do aplicativo a uma instância do objeto do aplicativo usando as funções app.use () e app.METHOD (), em que METHOD é o método HTTP da solicitação que a função do middleware manipula (como GET, PUT ou POST) em minúsculas.

você pode usar para verificar todas as solicitações; por exemplo, para verificar o token / acesso ao token, é necessário escrever um middleware usando app.use para verificar o token na solicitação.

Este exemplo mostra uma função de middleware sem caminho de montagem. A função é executada toda vez que o aplicativo recebe uma solicitação.

var app = express()

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

referência de https://expressjs.com/en/guide/using-middleware.html

Osama Bari
fonte
app.use () não é um middleware. Middleware é a função passada para app.use ()
NattyC
0

app.use (caminho, middleware) é usado para chamar a função de middleware que precisa ser chamada antes que a rota seja atingida para o caminho correspondente. Várias funções de middleware podem ser chamadas por meio de um app.use.

app.use ('/ fetch', enforceAuthentication) -> middleware enforceAuthentication fn será chamado quando uma solicitação iniciada com '/ fetch' for recebida. Pode ser / fetch / users , / fetch / ids / {id} , etc

Algumas funções de middleware podem precisar ser chamadas independentemente da solicitação. Para esses casos, um caminho não é especificado e, como o caminho é padrão para / e toda solicitação é iniciada com / , essa função de middleware será chamada para todas as solicitações.

app.use (() => {// Inicialize um serviço comum})

next () fn precisa ser chamado dentro de cada função de middleware quando várias funções de middleware são passadas para app.use , caso contrário, a próxima função de middleware não será chamada.

referência: http://expressjs.com/en/api.html#app.use

Nota: A documentação diz que podemos ignorar as funções do middleware seguindo a atual chamando next ('route') na função atual do middleware, mas essa técnica não funcionou para mim no app.use, mas funcionou com o app.METHOD como abaixo . Portanto, fn1 e fn2 foram chamados, mas não fn3.

app.get('/fetch', function fn1(req, res, next)  {
    console.log("First middleware function called"); 
        next();
    }, 
    function fn2(req, res, next) {
        console.log("Second middleware function called"); 
        next("route");
    }, 
    function fn3(req, res, next) {
        console.log("Third middleware function will not be called"); 
        next();
    })
user3022150
fonte