다음과 같은 경로가 있습니다.
app.all('/path/:namedParam/*splat?',function(req,res,next){
if(!req.params.length){
// do something when there is no splat
} else {
// do something with splat
}
});
그러나 이것은 작동 하지 않습니다. path/foo/bar
내가 전화하면 경로가 맞지만를 전화 path/foo
하면 작동하지 않습니다.
선택적 splat 매개 변수를 가질 수 있습니까, 아니면 이것을 감지하기 위해 정규식을 사용해야합니까?
편집 :
더 명확하게하기 위해 내가 달성하려는 요구 사항은 다음과 같습니다.
- 첫 번째 및 두 번째 매개 변수가 필요합니다.
- 첫 번째 매개 변수는 정적이고 두 번째 매개 변수는 명명 된 매개 변수입니다.
- 임의의 수의 선택적 추가 매개 변수를 추가 할 수 있으며 여전히 경로에 도달 할 수 있습니다.
답변
특급 4에 대한 / 경로 / 경로 / foo는이 작품은주의 *
전에 ?
.
router.get('/path/:id*?', function(req, res, next) {
res.render('page', { title: req.params.id });
});
답변
나는 방금 똑같은 문제가 있었고 그것을 해결했습니다. 이것이 내가 사용한 것입니다.
app.get('path/:required/:optional?*', ...)
이것은 작동한다 path/meow
, path/meow/voof
, path/meow/voof/moo/etc
…
와 /
사이 를 삭제하는 것으로 보이며 마지막 도 선택 사항이되고 선택 사항으로 유지됩니다.?
*
/
:optional?
답변
이것이 당신이 추구하는 것을 할 것인가?
app.all('/path/:namedParam/:optionalParam?',function(req,res,next){
if(!req.params.optionalParam){
// do something when there is no optionalParam
} else {
// do something with optionalParam
}
});
Express의 라우팅에 대한 자세한 내용은 http://expressjs.com/guide/routing.html을 참조하십시오.
답변
이 문제를 해결하는 현재 방법은 다음과 같습니다. express는 선택 사항 인 param이라는 선택적 매개 변수를 사용하여 여러 splat param을 지원하는 것 같지 않습니다.
app.all(/\/path\/([^\/]+)\/?(.+)?/,function(req,res,next){
// Note: this is all hacked together because express does not appear to support optional splats.
var params = req.params[1] ? [req.params[1]] : [],
name = req.params[0];
if(!params.length){
// do something when there is no splat
} else {
// do something with splat
}
});
가독성과 일관성을 위해 params라는 이름을 사용하고 싶습니다.이를 허용하는 다른 답변이 나타나면 받아 들일 것입니다.
답변
다음 URL이 있다고 가정합니다. /api/readFile/c:/a/a.txt
당신이 req.params.path
되고 싶다면 c:
:
'/api/readFile/:path*
당신이 req.params.path
되고 싶다면 c:/a/a.txt
:
'/api/readFile/:path([^/]*)'
답변
선택 사항을 사용하는 위의 솔루션은 Express 4에서 작동하지 않습니다. 그리고 검색 패턴을 사용하여 몇 가지 방법을 시도했지만 작동하지 않았습니다. 그런 다음이 방법을 찾았고 무제한 중첩 경로 http://expressjs.com/api.html#router에 대해 해고 된 것 같습니다 .
// this will only be invoked if the path starts with /bar from the mount point
router.use('/bar', function(req, res, next) {
// ... maybe some additional /bar logging ...
// to get the url after bar, you can try
var filepath = req.originalUrl.replace(req.baseUrl, "");
next();
});
모든 / bar, / bar / z, / bar / a / b / c 등과 일치합니다. 그 후에 params가 채워지지 않았기 때문에 req.originalUrl을 읽을 수 있습니다. baseUrl과 originalUrl을 비교하여 나머지 경로를 얻을 수 있습니다.
답변
나는 URL에 후행 슬래시를 추가 미들웨어와의 조합을 사용하여이 문제를 주변에있어 router.get('/bar/*?', ...
후 모든 데리러, /bar/
그리고 수익을 undefined
그냥 경우를 /bar/
. 방문자가 요청 /bar
하면 express-slash
미들웨어는 요청에 슬래시를 추가하고 요청을 /bar/
.