Diferenças entre express.Router e app.get?

265

Estou começando com NodeJS e Express 4, e estou um pouco confuso. Eu estava lendo o site do Express, mas não consigo ver quando usar um manipulador de rota ou quando usar express.Router.

Como pude ver, se eu quiser mostrar uma página ou algo quando o usuário acessar, /showpor exemplo, devo usar:

var express = require('express')    
var app = express()    
app.get("/show", someFunction)  

No começo, pensei que isso era antigo (para o Express 3). Está certo ou este também é o caminho para o Express 4?

Se essa é a maneira de fazer isso no Express 4, para que express.Routerserve?

Eu li quase o mesmo exemplo acima, mas usando express.Router:

var express = require('express');
var router = express.Router();
router.get("/show", someFunction)

Então, qual é a diferença entre os dois exemplos?

Qual deles devo usar se quiser apenas fazer um site de teste simples?

nelson687
fonte
27
A Routernão .listen()solicita por si só. É útil para separar seu aplicativo em vários módulos - criando um Routerem cada um que apppode require()e .use()como middleware.
Jonathan Lonowski
5
Como @JonathanLonowski sugeriu, a app.get(..)sintaxe é apenas um atalho para tornar o trabalho express.routermais conveniente. Se você está apenas começando, não se preocupe com as especificidades do roteador.
soulprovidr
1
então você está dizendo que eu deveria usar no momento apenas app.get ()? ainda confuso sobre quando usar um ou outro
nelson687
11
@ nelson687 Não existe realmente uma regra rígida entre eles. Se você sentir que os app'spróprios métodos de roteamento, como app.get(), são suficientes para suas necessidades, use-os. O Routerestá ali apenas por conveniência para ajudar a organizar a aplicação em vários módulos. No guia : " A express.Routerclasse pode ser usada para criar manipuladores de rota montáveis ​​modulares. Uma Routerinstância é um middleware completo e um sistema de roteamento; por esse motivo, é freqüentemente chamado de "
miniaplicativo

Respostas:

323

app.js

var express = require('express'),
    dogs    = require('./routes/dogs'),
    cats    = require('./routes/cats'),
    birds   = require('./routes/birds');

var app = express();

app.use('/dogs',  dogs);
app.use('/cats',  cats);
app.use('/birds', birds);

app.listen(3000);

dogs.js

var express = require('express');

var router = express.Router();

router.get('/', function(req, res) {
    res.send('GET handler for /dogs route.');
});

router.post('/', function(req, res) {
    res.send('POST handler for /dogs route.');
});

module.exports = router;

Quando var app = express()é chamado, um objeto de aplicativo é retornado. Pense nisso como o aplicativo principal .

Quando var router = express.Router()é chamado, um mini aplicativo ligeiramente diferente é retornado. A idéia por trás do mini aplicativo é que cada rota no seu aplicativo possa se tornar bastante complicada, e você se beneficiaria de mover todo esse código para um arquivo separado. O roteador de cada arquivo se torna um miniaplicativo , com uma estrutura muito semelhante à do aplicativo principal .

No exemplo acima, o código para a rota / dogs foi movido para seu próprio arquivo para não desorganizar o aplicativo principal . O código para / gatos e / pássaros seria estruturado de maneira semelhante em seus próprios arquivos. Ao separar esse código em três mini aplicativos , você pode trabalhar na lógica de cada um isoladamente e não se preocupar com como isso afetará os outros dois.

Se você possui um código (middleware) que pertence a todas as três rotas, é possível colocá-lo no aplicativo principal antes das app.use(...)chamadas. Se você tiver um código (middleware) referente a apenas uma dessas rotas, poderá colocá-lo no arquivo apenas para essa rota.

Noturno
fonte
caso você não tenha que passar o objeto do aplicativo, app.use('/dogs', dogs)(app)já que está definindo rotas para lá, além disso (e me corrija se estiver errado), se fizer dessa maneira, o objeto do aplicativo terá todos os itens intermediários anteriormente colocados nele e o middleware adicional será adicionado ao objeto do aplicativo (supondo que mais middleware esteja na rota de cães). se você o usar route.get('/dogs', route), apenas passará o middleware para o objeto do aplicativo ao interagir com as rotas definidas nesse roteador e se o escopo do aplicativo estiver fora da rota, ele não terá acesso a esse middleware.
Ravenous
1
Você não precisa passar o aplicativo para a rota, porque a rota está sendo passada para o aplicativo app.use('/dogs', show). Dessa forma, a rota é independente do aplicativo e pode ser reutilizada em qualquer aplicativo Express. Middleware colocado em qualquer lugar antes que uma rota seja usada por essa rota. Se você colocar o middleware acima de todas as rotas no app.js, todas as rotas usarão esse middleware. Se você colocar o middleware dentro de um arquivo de rota (dogs.js), somente essa rota o usará. Se você colocar o middleware após a rota GET em dogs.js, somente a rota POST o usará (contanto que termine com uma resposta).
Nocturno
Ah, meu mal. Eu pretendia colocar, app.get('/dogs'dogs,)(app)já que a pergunta era sobre o recurso get do app.get e route.get. você estava mostrando como separar as rotas para torná-las gerenciáveis. Mas minha anedota não estaria correta se estamos falando app.get? Se eu puder acessar um PC, editarei meu comentário acima.
Ravenous 21/10
2
Meu aplicativo ainda funciona quando eu uso express.Router () ou express (), eu não conseguia entender a diferença :(
Ajay Suwalka
3
@Ajay Suwalka Não sei como posso elaborar mais sobre o que já disse. Os documentos dizem "Um objeto roteador é uma instância isolada de middleware e rotas". Também gosto do comentário de Jonathan Lonowski acima, "A Routernão .listen()solicita por si próprio". Essa pode ser a principal diferença.
Nocturno
29

O Express 4.0 vem com o novo roteador. Conforme mencionado no site:

A classe express.Router pode ser usada para criar manipuladores de rota montáveis ​​modulares. Uma instância do roteador é um sistema completo de middleware e roteamento; por esse motivo, é frequentemente chamado de "miniaplicativo".

Há um bom artigo em https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4 que descreve as diferenças e o que pode ser feito com os roteadores.

Resumir

Com os roteadores, você pode modular seu código mais facilmente. Você pode usar roteadores como:

  1. Rotas básicas: Início, Sobre
  2. Roteie o Middleware para registrar solicitações no console
  3. Rota com parâmetros
  4. Roteie o Middleware for Parameters para validar parâmetros específicos
  5. Valida um parâmetro passado para uma determinada rota

Nota:

O app.routerobjeto, que foi removido no Express 4, voltou ao Express 5. Na nova versão, é apenas uma referência ao roteador Express base, ao contrário do Express 3, onde um aplicativo precisava carregá-lo explicitamente.

Alireza Fattahi
fonte
7
app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Post a random book')
  })

Como no exemplo acima, podemos adicionar diferentes métodos de solicitação HTTP em uma rota.

TILAK
fonte
5

Digamos que seu aplicativo seja pouco complexo. Então, o que fazemos primeiro é dividir o aplicativo em vários módulos para que as alterações em um módulo não atrapalhem as demais e você possa continuar trabalhando em módulos individuais, mas no final do dia você precisa integrar tudo em um desde que você estão construindo um único aplicativo. É como se tivéssemos um aplicativo principal e poucos aplicativos filhos cujo pai é o aplicativo principal. Então, quando criamos o aplicativo pai, criamos um usando

var express = require('express');
var parent = express();

E para esse aplicativo pai, precisamos incluir os aplicativos filhos. Mas como os aplicativos filhos não são totalmente diferentes (pois são executados no mesmo termo context-java), o express fornece a maneira de fazer isso por meio da função Router do Expresse e é isso que fazemos no arquivo de cada módulo filho e vamos chamar um módulo filho como aboutme .

var express = require('express');
var router = express.Router();
/**
** do something here
**/
module.exports = router;

Por module.exports , estamos disponibilizando este módulo para consumo por outros e, como modulamos as coisas, precisamos disponibilizar os arquivos do módulo para o aplicativo pai por meio da função de exigência do nó, como qualquer outro módulo de terceiros e o arquivo pai parece algo assim.

var express = require('express') 
var parent = express() 
var child = require(./aboutme)

depois de disponibilizar esse módulo filho para o pai, precisamos informar ao aplicativo pai quando usar esse aplicativo filho. Digamos que quando um usuário acessa o caminho sobre mim, precisamos do aplicativo filho sobre mim para lidar com a solicitação e fazemos isso usando o método de uso do Expresse .

parent.use('/aboutme',  aboutme);

e de uma só vez o arquivo pai se parece com isso

var express = require('express');
var parent = express();
var child = require(./aboutme);
/***
**do some stuff here
**/
parent.use('/aboutme',child);

Acima de tudo, o que os pais podem fazer é iniciar um servidor onde a criança não pode. Espero que isso esclareça. Para obter mais informações, você sempre pode olhar para o código-fonte que leva algum tempo, mas fornece muitas informações. Obrigado.

raj240
fonte
1
não deveria ser assim parent.use('/aboutme', child)?
Kees de Kooter 17/06/19
2

usar o app.js para escrever rotas significa que eles estão acessíveis a todos os usuários, pois o app.js é carregado no início do aplicativo. No entanto, colocar rotas nos miniaplicativos express.router () protege e restringe sua acessibilidade.

T.Soundarya
fonte
2

express.Router tem muitas opções:

  • ativar a distinção entre maiúsculas e minúsculas: a /showrota não deve ser a mesma que /Show, esse comportamento é desativado por padrão
  • modo de roteamento estrito: /show/rota para não ser igual a /show, esse comportamento também é desativado por padrão
  • podemos adicionar middleware / s específicos a rotas específicas
Ahmed Alawady
fonte
0

Em uma palavra, você express.Routerpode fazer mais coisas quando comparado a app.get(), como middleware, além disso, você pode definir mais um objeto roteador comexpress.Router()

yuanfang wang
fonte