source

Express-js 와일드카드 라우팅을 통해 경로를 포함한 모든 항목을 처리합니다.

ittop 2023. 7. 31. 21:52
반응형

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

반응형