express.js - manipulador de roteamento único para rotas múltiplas em uma única linha

108

Existe uma maneira de fazer isso em uma única chamada de função?

var todo = function (req, res){};

app.get("/", todo);
app.get("/blabla", todo);
app.get("/blablablabla", todo);

Algo como:

app.get("/", "/blabla", "/blablablabla", todo );

Eu sei que isso é uma confusão de sintaxe, mas apenas para dar uma ideia do que eu gostaria de alcançar, uma série de rotas seria incrível!

Alguém sabe como fazer isto?

Aronis Mariano
fonte
2
Você deve ser capaz de escrever uma expressão regular que corresponda a todas as rotas que deseja rotear para todo e usar a expressão regular como seu ponto de extremidade. Pode acabar parecendo bagunçado, mas funcionará. Não estou postando isso como uma resposta, pois não tenho certeza de qual seria a expressão regular, e isso é mais um empurrão nessa direção. Há menção do uso de expressões regulares nos documentos aqui: expressjs.com/api.html#app.VERB
Nick Mitchinson
Eu não tenho experiência com regex em JS ... vou tentar ... mas qualquer outra opção é bem-vinda!
Aronis Mariano
1
Eu também não tenho muito, e honestamente é por isso que eu não apenas dei a você, no entanto, meu entendimento é que as expressões regulares são bastante universais; O Express deve analisar suas expressões praticamente da mesma forma que qualquer outra linguagem.
Nick Mitchinson
1
As expressões regulares são muito poderosas e definitivamente vale a pena aprender. Aqui está uma solução: app.get (/ ^ \ / ((blabla) {0,2}) $ /, function (req, resp) {var matched = req.params [0]; resp .set ('Content- digite ',' texto / simples ') .send ("Matched:'" + match + "'");}); Algumas coisas: 1. regex's começam e terminam com /, então qualquer / chars deve ter escape. 2. O ^ char corresponde ao início da string, o $ char corresponde ao final da string. Sem eles, a correspondência terá sucesso mesmo com caracteres estranhos no início ou no final do caminho, ou seja, / x / blablaxxx
John Deighan

Respostas:

131

Eu me deparei com essa pergunta enquanto procurava a mesma funcionalidade.

@Jonathan Ong mencionou em um comentário acima que o uso de arrays para caminhos está obsoleto, mas está explicitamente descrito no Express 4 e funciona no Express 3.x. Aqui está um exemplo de algo para tentar:

app.get(
    ['/test', '/alternative', '/barcus*', '/farcus/:farcus/', '/hoop(|la|lapoo|lul)/poo'],
    function ( request, response ) {

    }
);

De dentro do requestobjeto, com um caminho de /hooplul/poo?bandle=froo&bandle=pee&bof=blarg:

"route": {
    "keys": [
        {
            "optional": false, 
            "name": "farcus"
        }
    ], 
    "callbacks": [
        null
    ], 
    "params": [
        null, 
        null, 
        "lul"
    ], 
    "regexp": {}, 
    "path": [
        "/test", 
        "/alternative", 
        "/barcus*", 
        "/farcus/:farcus/", 
        "/hoop(|la|lapoo|lul)/poo"
    ], 
    "method": "get"
}, 

Observe o que acontece com os parâmetros: ele está ciente dos grupos de captura e dos parâmetros em todos os caminhos possíveis, sejam eles usados ​​ou não na solicitação atual.

Portanto, empilhar vários caminhos por meio de um array pode ser feito facilmente, mas os efeitos colaterais são possivelmente imprevisíveis se você espera obter algo útil do caminho que foi usado por meio de parâmetros ou grupos de captura. É provavelmente mais útil para redundância / aliasing, caso em que funcionará muito bem.

Edit: Consulte também a resposta de @ c24w abaixo .

Edit 2: Esta é uma resposta moderadamente popular. Lembre-se de que o ExpressJS, como a maioria das bibliotecas Node.js, é um banquete móvel. Embora o roteamento acima ainda funcione (estou usando-o no momento, um recurso muito útil), não posso garantir a saída do objeto de solicitação (certamente é diferente do que descrevi). Teste cuidadosamente para garantir que obtém os resultados desejados.

Kevin Teljeur
fonte
58
app.get('/:var(bla|blabla)?', todo)

:vardefine o req.paramque você não usa. é usado apenas neste caso para definir o regex.

(bla|blabla)define a regex para corresponder, de forma que corresponda às strings blae blablah.

?torna toda a regex opcional, portanto, também corresponde /.

Jonathan Ong
fonte
1
/bla(bla)?também funciona, mas qualquer parâmetro posterior não é preenchido corretamente (ou seja, /bla(bla)?/:valuenão é preenchido req.params.value). Alguém sabe por quê?
joscarsson
Se estiver usando expresso, você pode obtê-lo, req.params.varmas precisa ter certeza de que reqpassou para a função
Matt The Ninja
51

Você pode realmente passar por uma série de caminhos , assim como mencionou, e funciona muito bem:

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);
alex
fonte
28
Qual é o substituto para o uso suspenso?
brandonscript de
5
@JonathanOng Você diz que isso está obsoleto e remus está perguntando qual é o substituto. Você poderia responder à pergunta dele?
nbro
router.route (['/ mailer / out / system', '/ mailer / out / payment']) está funcionando bem no expresso 4 sem aviso de depreciação
danday74 de
2
@JonathanOng olhando para os documentos atuais do Express v4 usando uma matriz, não parece estar obsoleto.
Jason Axelson,
32

Apenas para elaborar a resposta de Kevin , esta é a documentação do 4.x :

O caminho para o qual a função de middleware é chamada; pode ser qualquer um dos seguintes:

  • Uma string que representa um caminho.
  • Um padrão de caminho.
  • Um padrão de expressão regular para combinar caminhos.
  • Uma matriz de combinações de qualquer uma das opções acima.

Eles têm alguns exemplos , incluindo:

Isso irá corresponder caminhos começando com /abcd, /xyza, /lmn, e /pqr:

app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
  next();
});
c24w
fonte
11

Eu fui por um:

['path', 'altPath'].forEach(function(path) {
  app.get(path, function(req, res) { etc. });
});
Augustin Riedinger
fonte
-2

solicite o arquivo de sua rota original e defina a nova rota assim

var user = require('./users');
router.post('/login', user.post('/login'));
Roman Mahrer
fonte