app.use()
está destinado a vincular middleware a su aplicación. El path
es una ruta de " montaje " o " prefijo " y limita el middleware para que solo se aplique a las rutas solicitadas que comienzan con él. Incluso se puede usar para incrustar otra aplicación:
// subapp.js
var express = require('express');
var app = modules.exports = express();
// ...
// server.js
var express = require('express');
var app = express();
app.use('/subapp', require('./subapp'));
// ...
Al especificar /
como una ruta de " montaje ", app.use()
responderá a cualquier ruta que comience /
, que son todas e independientemente del verbo HTTP utilizado:
GET /
PUT /foo
POST /foo/bar
- etc.
app.get()
, por otro lado, es parte del enrutamiento de la aplicación Express y está destinado a hacer coincidir y manejar una ruta específica cuando se solicita con el GET
verbo HTTP:
Y, el enrutamiento equivalente para su ejemplo de app.use()
realidad sería:
app.all(/^\/.*/, function (req, res) {
res.send('Hello');
});
( Actualización: Intentando demostrar mejor las diferencias ) .
Los métodos de enrutamiento, incluidos app.get()
, son métodos convenientes que lo ayudan a alinear las respuestas a las solicitudes con mayor precisión. También agregan soporte para características como parámetros y next('route')
.
Dentro de cada uno app.get()
hay una llamada a app.use()
, por lo que ciertamente puede hacer todo esto app.use()
directamente. Pero hacerlo requerirá a menudo (probablemente innecesariamente) reimplementar varias cantidades de código repetitivo.
Ejemplos:
Para rutas simples y estáticas:
app.get('/', function (req, res) {
// ...
});
vs.
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
// ...
});
Con múltiples controladores para la misma ruta:
app.get('/', authorize('ADMIN'), function (req, res) {
// ...
});
vs.
const authorizeAdmin = authorize('ADMIN');
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
authorizeAdmin(req, res, function (err) {
if (err) return next(err);
// ...
});
});
Con parámetros:
app.get('/item/:id', function (req, res) {
let id = req.params.id;
// ...
});
vs.
const pathToRegExp = require('path-to-regexp');
function prepareParams(matches, pathKeys, previousParams) {
var params = previousParams || {};
// TODO: support repeating keys...
matches.slice(1).forEach(function (segment, index) {
let { name } = pathKeys[index];
params[name] = segment;
});
return params;
}
const itemIdKeys = [];
const itemIdPattern = pathToRegExp('/item/:id', itemIdKeys);
app.use('/', function (req, res, next) {
if (req.method !== 'GET') return next();
var urlMatch = itemIdPattern.exec(req.url);
if (!urlMatch) return next();
if (itemIdKeys && itemIdKeys.length)
req.params = prepareParams(urlMatch, itemIdKeys, req.params);
let id = req.params.id;
// ...
});
Nota: la aplicación de estas características Express están contenidos en su Router
, Layer
yRoute
.