Estou tentando fazer com que uma rota cubra tudo /foo
incluindo a /foo
si mesma. Eu tentei usar /foo*
esse trabalho para tudo, exceto que não corresponde /foo
. Observar:
var express = require("express"),
app = express.createServer();
app.get("/foo*", function(req, res, next){
res.write("Foo*\n");
next();
});
app.get("/foo", function(req, res){
res.end("Foo\n");
});
app.get("/foo/bar", function(req, res){
res.end("Foo Bar\n");
});
app.listen(3000);
Saídas:
$ curl localhost:3000/foo
Foo
$ curl localhost:3000/foo/bar
Foo*
Foo Bar
Quais são minhas opções? O melhor que descobri é a rota, o /fo*
que obviamente não é muito ideal, pois combinaria demais.
/foo*
rotas assim, não quer torná-lo um middleware?/foo*
correspondências,/foo/bar
mas também correspondências/foolish
que você provavelmente não pretendia.Respostas:
Eu acho que você terá que ter 2 rotas. Se você olhar a linha 331 do roteador de conexão, o * em um caminho é substituído por. +, Portanto, corresponderá a 1 ou mais caracteres.
https://github.com/senchalabs/connect/blob/master/lib/middleware/router.js
Se você tiver 2 rotas que executam a mesma ação, você pode fazer o seguinte para mantê-las SECAS .
fonte
app.get(["/foo", "/foo*"], /* function */);
pode ser preferencial também!O roteador de conexão agora foi removido ( https://github.com/senchalabs/connect/issues/262 ), o autor afirmando que você deve usar uma estrutura em cima de conectar (como Express) para roteamento.
O Express atualmente trata
app.get("/foo*")
comoapp.get(/\/foo(.*)/)
, eliminando a necessidade de duas rotas separadas. Isso está em contraste com a resposta anterior (referindo-se ao roteador de conexão agora removido), que afirmou que "*
em um caminho é substituído por.+
".Update: Express agora usa o módulo "path-to-regexp" (desde Express 4.0.0) que mantém o mesmo comportamento na versão atualmente referenciada. Não está claro para mim se a versão mais recente desse módulo mantém o comportamento, mas por enquanto esta resposta permanece.
fonte
/\/foo(.+)/
se quiser fazer a correspondência/foo
seguida por um ou mais caracteres e/foo*
ou/\/foo(.*)/
se quiser fazer uma correspondência/foo
seguida por zero ou mais caracteres.Aqui está um exemplo funcional, fique à vontade para copiar e colar em um arquivo .js para executar com o node e brincar com ele em um navegador (ou curl):
fonte
No array, você também pode usar variáveis passando para req.params:
fonte
Para aqueles que estão aprendendo node / express (assim como eu): não use o roteamento curinga, se possível!
Eu também queria implementar o roteamento para GET / users /: id / qualquer coisa usando o roteamento curinga. Foi assim que cheguei aqui.
Felizmente, também encontrei este artigo: http://www.jongleberry.com/wildcard-routing-is-an-anti-pattern.html
Saúde, Robert
fonte