Diferença entre app.use () e router.use () no Express

87

Eu estava lendo a documentação do Express e encontrei esses dois termos, app.use();erouter.use();

Eu sei que app.use();é usado no nó para montar um middleware em um caminho e costumamos usá-lo na maioria dos aplicativos de nó. mas o que é router.use();que ambos são iguais? se não, qual é a diferença?

Eu li sobre o roteador aqui . Também encontrei perguntas semelhantes no SO Qual é a diferença entre "express.Router" e roteamento usando "app.get"? e Diferença entre app.all ('*') e app.use ('/') , mas eles não respondem realmente à minha pergunta. Obrigado.

Naeem Shaikh
fonte

Respostas:

122

router.getserve apenas para definir subcaminhos. Considere este exemplo:

var router = express.Router();

app.use('/first', router); // Mount the router as middleware at path /first

router.get('/sud', smaller);

router.get('/user', bigger);
  • Se você abrir / first / sud , a smallerfunção será chamada.
  • Se você abrir / primeiro / usuário , a biggerfunção será chamada.

Resumindo, primeiro app.use('/first', router)monta o middleware em path / , em seguida, router.getdefine o subcaminho de acordo.


Mas se, em vez disso, usarmos o seguinte:

app.use('/first', fun);

app.get('/sud', bigger);

app.get('/user', smaller);
  • Se você abrir / primeiro em seu navegador, funserá chamado,
  • Para / sud , biggerserá chamado
  • Para / usuário , smallerserá chamado

Mas lembre-se de / first / sud , nenhuma função será chamada.

Este link também pode ajudar: http://expressjs.com/api.html#router

Sudhanshu Gaur
fonte
Eu editei minha resposta @NaeemShaikh pls have a relook.
Sudhanshu Gaur
4
Mas por que usar o roteador quando você pode ir app.use ('/ first / sud', menor); e app.use ('/ primeiro / usuário', maior)? Quero dizer, eles criaram um roteador para que não tenhamos que digitar coisas extras no primeiro parâmetro?
mskw
boa pergunta olha, eu não sei direito, mas acho que é isso que o roteamento foi feito para detectar em urls onde app.use é feito para middleware, agora você pode usareapp.use ('/ first / sud', menor); mas suponha que em seu aplicativo você tenha muitas rotas começando como / primeiro / segundo / terceiro / quarto agora você faria todas as rotas aqui / primeiro / segundo / terceiro / quarto / x, não, você usará o roteador aqui, lembre-se de que ambos funcionam bem, mas o roteador foi feito apenas para essas finalidades de urls
Sudhanshu Gaur
Então, isso significa que não podemos fazer aninhamento usando router. Podemos fazer apenas por app. Isso é correto?
Mr_Perfect
Por que o OP pergunta a respeito, router.usemas esta resposta responde referindo-se a router.get?
Tim Heilman
72

router.use();monta o middleware para as rotas servidas pelo roteador específico, app.use();monta o middleware para todas as rotas do aplicativo (ou aqueles que correspondem às rotas especificadas se você usar app.use('/ANYROUTESHERE', yourMiddleware());).

O caso de uso de exemplo poderia ser um aplicativo com um roteador com rotas padrão e um roteador que lida com rotas de API, que precisam de um usuário válido.

Em seguida, você montaria o middleware de autenticação para o roteador api apenas com router.use(yourAuthMiddleware());.

Se você tiver um aplicativo que requer um usuário válido para todas as rotas, monte o middleware para o aplicativo com app.use(yourAuthMiddleware());

Laura
fonte
Posso criar um novo roteador e depois useem outro roteador? Likerouter1.use('/path', router2);
CodyBugstein
6
Esta resposta é clara e deve ser aceita. O roteador é frequentemente mal utilizado onde o aplicativo seria mais apropriado.
AturSams de
1

app.use () usado para Montar a função ou funções de middleware no caminho especificado, a função de middleware é executada quando a base do caminho solicitado corresponde ao caminho.

router.use () é usado para funções ou funções de middleware, o caminho de montagem padrão para “/”.

Mas em app.use () você terá que fornecer um caminho especificado como este:

 var adsRouter = require('./adsRouter.js');
    app.use('/ads', adsRouter);

ou

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

  // write your callback code here.

    });

Mas enquanto usa router.use (), você pode fornecer apenas middleware, como este:

router.use(function(req, res, next) {
  console.log('%s %s %s', req.method, req.url, req.path);
  next();
});

ou

router.use('/test', function(req, res, next) {
  // write your callback code here.
  next();
});

ou

//in router.js

router.use('/admin', authUtil.verifySessionId, authUtil.verifyLisencee);
router.post('/admin', controllerIndex.ads.adListingAdmin);

No código acima, quando o ponto de extremidade é '/ admin', primeiro ele chamará authUtil.verifySessionId e authUtil.verifyLisencee e então executará a próxima linha com o ponto de extremidade 'admin' e de acordo com o método controllerIndex.ads.adListingAdmin.

Shubham Verma
fonte
1
Não é necessário fornecer um caminho app.usese você quiser executar a função para cada solicitação feita ao aplicativo.
jacefarm de
@shubham Você me explicou muito bem e foi muito útil para mim. No caso do roteador com middleware, também podemos mesclá-lo em uma única linha, como router.delete ("/: id / delete", middleware.checkToken, userController.deleteUser)
Sourabh Bhutani