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 GETverbo 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, LayereRoute .