app.use()
destina-se a vincular o middleware ao seu aplicativo. O path
é um caminho " mount " ou " prefix " e limita o middleware a aplicar-se apenas a todos os caminhos solicitados que começam com ele. Pode até ser usado para incorporar outro aplicativo:
// 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'));
// ...
Ao especificar /
como um caminho " mount ", app.use()
responderá a qualquer caminho que comece com /
, todos eles e independentemente do verbo HTTP usado:
GET /
PUT /foo
POST /foo/bar
- etc.
app.get()
, por outro lado, faz parte do roteamento de aplicativo do Express e destina-se a corresponder e manipular uma rota específica quando solicitado com o GET
verbo HTTP:
E, o roteamento equivalente para o seu exemplo app.use()
seria:
app.all(/^\/.*/, function (req, res) {
res.send('Hello');
});
( Atualização: Tentativa de demonstrar melhor as diferenças. )
Os métodos de roteamento, inclusive app.get()
, são métodos de conveniência que ajudam a alinhar as respostas às solicitações com mais precisão. Eles também adicionam suporte a recursos como parâmetros e next('route')
.
Em cada uma delas app.get()
há uma chamada para app.use()
, assim você certamente pode fazer tudo isso app.use()
diretamente. Mas, para isso, muitas vezes será necessário (provavelmente desnecessariamente) reimplementar várias quantidades de código padrão.
Exemplos:
Para rotas estáticas simples:
app.get('/', function (req, res) {
// ...
});
vs.
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
// ...
});
Com vários manipuladores para a mesma rota:
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);
// ...
});
});
Com 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: implementação destas características Express' estão contidos em sua Router
, Layer
eRoute
.