Express-js 와일드카드 라우팅을 통해 경로를 포함한 모든 항목을 처리합니다.
하나의 경로로 모든 것을 커버하려고 합니다./foo
포함하여/foo
그 자체로사용해 보았습니다./foo*
일치하지 않는 것을 제외하고는 모든 것에 효과가 있습니다./foo
관찰:
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);
출력:
$ curl localhost:3000/foo
Foo
$ curl localhost:3000/foo/bar
Foo*
Foo Bar
제가 선택할 수 있는 방법이 무엇입니까?제가 생각해낸 최선의 방법은/fo*
물론 그것은 너무 많이 일치하기 때문에 매우 최적적이지요.
제 생각에 당신은 2개의 경로가 있어야 할 것 같습니다.연결 라우터의 331행을 보면 경로의 *가 .+로 바뀌므로 1자 이상과 일치합니다.
https://github.com/senchalabs/connect/blob/master/lib/middleware/router.js
동일한 작업을 수행하는 경로가 2개인 경우 다음을 수행하여 건조 상태를 유지할 수 있습니다.
var express = require("express"),
app = express.createServer();
function fooRoute(req, res, next) {
res.end("Foo Route\n");
}
app.get("/foo*", fooRoute);
app.get("/foo", fooRoute);
app.listen(3000);
이제 연결 라우터가 제거되었습니다(https://github.com/senchalabs/connect/issues/262), 작성자는 라우팅을 위해 연결 상단의 프레임워크(예: Express)를 사용해야 한다고 말합니다).
현재 처리를 표현합니다. app.get("/foo*")
~하듯이app.get(/\/foo(.*)/)
두 개의 별도 경로의 필요성을 제거합니다.이것은 "(지금은 제거된 연결 라우터를 지칭) 이전의 답변과 대조적입니다.*
로 대체된 경로에서.+
".
업데이트: Express는 이제 현재 참조된 버전에서 동일한 동작을 유지하는 "경로 대 정규식" 모듈(Express 4.0.0 이후)을 사용합니다.그 모듈의 최신 버전이 동작을 유지하는지는 확실하지 않지만, 현재로서는 이 대답이 유효합니다.
두 개의 경로가 필요하지 않습니다.
간단히 추가
(/*)?
당신의 마지막에path
현을 매다예를 들면,
다음은 완전히 작동하는 예제입니다. 노드와 함께 실행할 .js 파일에 자유롭게 복사하여 붙여넣고 브라우저(또는 컬)에서 재생할 수 있습니다.
const app = require('express')()
// will be able to match all of the following
const test1 = 'http://localhost:3000/hello/world'
const test2 = 'http://localhost:3000/hello/world/'
const test3 = 'http://localhost:3000/hello/world/with/more/stuff'
// but fail at this one
const failTest = 'http://localhost:3000/foo/world'
app.get('/hello/world(/*)?', (req, res) => res.send(`
This will match at example endpoints: <br><br>
<pre><a href="${test1}">${test1}</a></pre>
<pre><a href="${test2}">${test2}</a></pre>
<pre><a href="${test3}">${test3}</a></pre>
<br><br> Will NOT match at: <pre><a href="${failTest}">${failTest}</a></pre>
`))
app.listen(3000, () => console.log('Check this out in a browser at http://localhost:3000/hello/world!'))
배열에서 req.params로 전달되는 변수를 사용할 수도 있습니다.
app.get(["/:foo", "/:foo/:bar"], /* function */);
노드/익스프레스(나와 마찬가지로)를 배우는 사람: 가능하면 와일드카드 라우팅을 사용하지 마십시오!
또한 와일드카드 라우팅을 사용하여 GET /users/:id/anything에 대한 라우팅을 구현하고 싶었습니다.이게 제가 여기 온 방법입니다.
추가 정보: https://blog.praveen.science/와일드카드-루팅-안티패턴/
언급URL : https://stackoverflow.com/questions/6161567/express-js-wildcard-routing-to-cover-everything-under-and-including-a-path
'source' 카테고리의 다른 글
오류: 'keytool'이(가) 내부 또는 외부 명령, 작동 가능한 프로그램 또는 배치 파일로 인식되지 않습니다. (0) | 2023.07.31 |
---|---|
nodejs 연결 오류: "'static' 메서드가 없습니다." (0) | 2023.07.31 |
Spring WebFlux WebClient 복원력 및 성능 (0) | 2023.07.31 |
Ubuntu를 사용하여 도커 컨테이너 내에 pip 패키지를 설치할 수 없습니다. (0) | 2023.07.31 |
Android:보기를 아래로 스크롤합니다. (0) | 2023.07.31 |