¿Diferencias entre express.Router y app.get?

265

Estoy empezando con NodeJS y Express 4, y estoy un poco confundido. He estado leyendo el sitio web de Express, pero no puedo ver cuándo usar un controlador de ruta o cuándo usarlo express.Router.

Como pude ver, si quiero mostrar una página o algo cuando el usuario golpea, /showpor ejemplo, debería usar:

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

Al principio, pensé que esto era viejo (para Express 3). ¿Es correcto o este también es el camino para Express 4?

Si esta es la forma de hacerlo en Express 4, ¿ express.Routerpara qué se utiliza?

Leí casi el mismo ejemplo que el anterior pero usando express.Router:

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

Entonces, ¿cuál es la diferencia entre ambos ejemplos?

¿Cuál debo usar si solo quiero hacer un sitio web de prueba simple?

nelson687
fuente
27
A Routerno acepta .listen()solicitudes por sí solo. Es útil para separar su aplicación en múltiples módulos, creando uno Routeren cada uno que apppueda require()y .use()como middleware.
Jonathan Lonowski
55
Como insinuó @JonathanLonowski, la app.get(..)sintaxis es solo un atajo para que trabajar sea express.routermás conveniente. Si recién comienza, no se preocupe por los detalles del enrutador.
soulprovidr
1
¿Estás diciendo que debería usar por el momento solo app.get ()? todavía confundido sobre cuándo usar uno u otro
nelson687 03 de
11
@ nelson687 No hay realmente una regla establecida entre ellos. Si cree que los app'spropios métodos de enrutamiento, como por ejemplo app.get(), son suficientes para sus necesidades, úselos. El Routerestá ahí sólo por conveniencia para ayudar a organizar la aplicación a través de múltiples módulos. De la guía : " La express.Routerclase se puede utilizar para crear controladores de ruta montables modulares. Una Routerinstancia es un middleware completo y un sistema de enrutamiento; por esta razón, a menudo se lo conoce como una" mini aplicación " "
Jonathan Lonowski,

Respuestas:

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);

perros.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;

Cuando var app = express()se llama, se devuelve un objeto de aplicación. Piense en esto como la aplicación principal .

Cuando var router = express.Router()se llama, se devuelve una mini aplicación ligeramente diferente . La idea detrás de la mini aplicación es que cada ruta en su aplicación puede volverse bastante complicada, y usted se beneficiaría de mover todo ese código en un archivo separado. El enrutador de cada archivo se convierte en una mini aplicación , que tiene una estructura muy similar a la aplicación principal .

En el ejemplo anterior, el código para la ruta / dogs se ha movido a su propio archivo para que no abarrote la aplicación principal . El código para / cats y / birds se estructuraría de manera similar en sus propios archivos. Al separar este código en tres mini aplicaciones , puede trabajar en la lógica de cada una de forma aislada y no preocuparse por cómo afectará a las otras dos.

Si tiene un código (middleware) que pertenece a las tres rutas, puede ponerlo en la aplicación principal , antes de las app.use(...)llamadas. Si tiene un código (middleware) que pertenece solo a una de esas rutas, puede colocarlo en el archivo solo para esa ruta.

Nocturno
fuente
no debería tener que pasar el objeto de la aplicación app.use('/dogs', dogs)(app)ya que está definiendo rutas allí, además (y corríjame si estoy equivocado) si lo hace de esta manera, el objeto de la aplicación tiene todo el middleware previamente colocado en él y se agregará middleware adicional al objeto de la aplicación (suponiendo que haya más middleware en la ruta de los perros). si lo usa route.get('/dogs', route), solo pasa el middleware al objeto de la aplicación cuando interactúa con las rutas definidas en ese enrutador y si el alcance de la aplicación está fuera de la ruta, no tiene acceso a ese middleware.
Voraz
1
No necesita pasar la aplicación a la ruta, porque la ruta se pasa a la aplicación con app.use('/dogs', show). De esta manera, la ruta es independiente de la aplicación y se puede reutilizar en cualquier aplicación Express. Middleware colocado en cualquier lugar antes de que una ruta sea utilizada por esa ruta. Si coloca middleware sobre todas las rutas en app.js, entonces todas las rutas usarán ese middleware. Si coloca middleware dentro de un archivo de ruta (dogs.js), solo esa ruta lo usará. Si coloca middleware después de la ruta GET dentro de dogs.js, solo la ruta POST lo usará (siempre que termine con una respuesta).
Nocturno
Ahh mi mal. app.get('/dogs'dogs,)(app)Quise decir ya que la pregunta era sobre la función get de app.get y route.get. estabas mostrando cómo separar las rutas para hacerlas manejables. ¿Pero no sería correcta mi anécdota si estamos hablando app.get? Si puedo acceder a una PC, editaré mi comentario anterior.
Voraz
2
Mi aplicación todavía funciona cuando uso express.Router () o express (), no podía entender la diferencia :(
Ajay Suwalka
3
@Ajay Suwalka No sé cómo puedo elaborar más sobre lo que ya he dicho. Los documentos dicen "Un objeto enrutador es una instancia aislada de middleware y rutas". También me gusta el comentario de @Jonathan Lonowski arriba, "A Routerno lo hace .listen()para solicitudes por sí mismo". Esa podría ser la principal diferencia.
Nocturno
29

Express 4.0 viene con el nuevo enrutador. Como se menciona en el sitio:

La clase express.Router se puede utilizar para crear controladores de ruta montables modulares. Una instancia de enrutador es un sistema de enrutamiento y middleware completo; Por esta razón, a menudo se la denomina "mini aplicación".

Hay un buen artículo en https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4 que describe las diferencias y lo que se puede hacer con los enrutadores.

Para resumir

Con los enrutadores puede modularizar su código más fácilmente. Puede usar enrutadores como:

  1. Rutas básicas: Inicio, Acerca de
  2. Enrutar Middleware para registrar solicitudes en la consola
  3. Ruta con parámetros
  4. Enrutar Middleware para parámetros para validar parámetros específicos
  5. Valida un parámetro pasado a una ruta determinada

Nota:

El app.routerobjeto, que fue eliminado en Express 4, ha regresado en Express 5. En la nueva versión, es solo una referencia al enrutador Express base, a diferencia de Express 3, donde una aplicación tuvo que cargarlo explícitamente.

Alireza Fattahi
fuente
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 en el ejemplo anterior, podemos agregar diferentes métodos de solicitud HTTP en una ruta.

TILAK
fuente
5

Digamos que su aplicación es poco compleja. Entonces, lo que hacemos primero es dividir la aplicación en múltiples módulos para que los cambios en un módulo no abarroten a los demás y pueda seguir trabajando en módulos individuales, pero al final del día necesita integrar todo en uno ya que están creando una sola aplicación. Es como si tuviéramos una aplicación principal y pocas aplicaciones secundarias cuyo padre es la aplicación principal. Entonces, cuando creamos la aplicación principal, creamos una usando

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

Y para esta solicitud principal necesitamos traer las solicitudes secundarias. Pero dado que las aplicaciones secundarias no son aplicaciones totalmente diferentes (ya que se ejecutan en el mismo término contexto-java), express proporciona la forma de hacerlo mediante la función del enrutador Expresse y esto es lo que hacemos en cada archivo de módulo secundario y llamemos a uno de esos módulos secundarios como aboutme .

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

Por module.exports estamos haciendo que este módulo esté disponible para que otros lo consuman y dado que hemos modularizado las cosas, necesitamos que los archivos del módulo estén disponibles para la aplicación principal mediante la función require del nodo, al igual que cualquier otro módulo de terceros y el archivo principal se ve algo como esto.

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

después de que este módulo secundario esté disponible para los padres, debemos informarle a la aplicación principal cuándo usar esta aplicación secundaria. Digamos que cuando un usuario encuentra el camino sobre mí, necesitamos la aplicación secundaria sobre mí para manejar la solicitud y lo hacemos utilizando el método de uso de Expresse .

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

y de una sola vez el archivo padre se ve así

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

Sobre todo, lo que el padre puede hacer es iniciar un servidor donde el hijo no puede. Espero que esto aclare. Para obtener más información, siempre puede consultar el código fuente, que lleva algo de tiempo, pero le brinda mucha información. Gracias.

raj240
fuente
1
no debería ser esto parent.use('/aboutme', child)?
Kees de Kooter
2

El uso de app.js para escribir rutas significa que son accesibles para todos los usuarios a medida que app.js se carga al iniciar la aplicación. Sin embargo, poner rutas en las mini aplicaciones express.router () protege y restringe su accesibilidad.

T.Soundarya
fuente
2

express.Router tiene muchas opciones:

  • habilitar mayúsculas y minúsculas: la /showruta no será la misma que /Show, este comportamiento está deshabilitado de forma predeterminada
  • modo de enrutamiento estricto: la /show/ruta no es la misma que /show, este comportamiento también está deshabilitado de forma predeterminada
  • podemos agregar middleware / s específicos a rutas específicas
Ahmed Alawady
fuente
0

En una palabra, express.Routerpuede hacer más cosas en comparación con app.get(), como middleware, además, puede definir un objeto de enrutador más conexpress.Router()

yuanfang wang
fuente