express.js-한 줄의 여러 경로에 대한 단일 라우팅 처리기


108

단일 함수 호출에서 이것을 만드는 방법이 있습니까?

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

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

다음과 같은 것 :

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

나는 이것이 구문 엉망이라는 것을 알고 있지만 내가 달성하고 싶은 아이디어를 제공하기 위해 경로 배열이 멋질 것입니다!

누구든지 이것을하는 방법을 알고 있습니까?


2
할 일로 라우팅하려는 모든 경로와 일치하는 정규식을 작성하고 정규식을 엔드 포인트로 사용할 수 있어야합니다. 지저분 해 보일 수 있지만 작동합니다. 나는 정규 표현식이 무엇인지 확실하지 않기 때문에 이것을 대답으로 게시하지 않고 있으며 이것은 그 방향으로 나아가는 것입니다. 여기에 문서에서 정규 표현식을 사용하는 언급이있다 : expressjs.com/api.html#app.VERB
닉 Mitchinson

나는 JS에서 정규식에 대한 경험이 없습니다 ... 나쁘게 시도해보십시오 ... 그러나 다른 옵션은 환영합니다!
Aronis Mariano

1
나도 많이 가지고 있지 않습니다. 솔직히 말해서 여러분에게주지 않은 이유입니다. 그러나 제 이해는 정규식이 상당히 보편적이라는 것입니다. Express는 다른 언어와 거의 동일하게 표현식을 구문 분석합니다.
Nick Mitchinson 2013 년

1
정규 표현식은 매우 강력하고 확실히 배울 가치가 있습니다. 해결책은 다음과 같습니다. app.get (/ ^ \ / ((blabla) {0,2}) $ /, function (req, resp) {var matched = req.params [0]; resp .set ( 'Content- type ','text / plain ') .send ( "일치 :'"+ 일치 + " '");}); 몇 가지 : 1. 정규식은 /로 시작하고 끝납니다. 따라서 / 문자는 이스케이프해야합니다. 2. ^ 문자는 문자열의 시작과 일치하고 $ 문자는 문자열의 끝과 일치합니다. 그없이 경기조차 시작 또는 경로의 끝, 즉 / X / blablaxxx에서 외부 문자와 성공
존 Deighan

답변:


131

동일한 기능을 찾는 동안이 질문을 보았습니다.

@Jonathan Ong는 위의 주석에서 경로에 배열을 사용하는 것은 더 이상 사용되지 않지만 Express 4에 명시 적으로 설명되어 있으며 Express 3.x에서 작동한다고 언급했습니다. 다음은 시도해 볼 수있는 예입니다.

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

    }
);

request객체 내부에서 경로가 /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"
}, 

매개 변수에서 발생하는 일에 유의하십시오. 현재 요청에서 사용되는지 여부에 관계없이 가능한 모든 경로에서 캡처 그룹 및 매개 변수를 인식합니다.

따라서 배열을 통해 여러 경로를 쌓는 것은 쉽게 수행 할 수 있지만 매개 변수 또는 캡처 그룹을 통해 사용 된 경로에서 유용한 것을 선택하려는 경우 부작용을 예측할 수 없습니다. 중복 / 앨리어싱에 더 유용 할 것입니다.이 경우 매우 잘 작동합니다.

편집 : 아래 @ c24w의 답변도 참조하십시오 .

편집 2 : 이것은 적당히 인기있는 대답입니다. 대부분의 Node.js 라이브러리와 마찬가지로 ExpressJS는 움직일 수있는 축제입니다. 위의 라우팅은 여전히 ​​작동하지만 (지금은 매우 편리한 기능입니다) 요청 객체의 출력을 보증 할 수 없습니다 (제가 설명한 것과 확실히 다릅니다). 원하는 결과를 얻으려면 신중하게 테스트하십시오.


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

:varreq.param사용하지 않는 설정 . 이 경우 정규식을 설정하는 데만 사용됩니다.

(bla|blabla)일치하도록 정규식을 설정하므로 문자열 blablablah.

?전체 정규식을 선택적으로 만들므로 일치 /합니다.


1
/bla(bla)?또한 작동하지만 이후의 모든 매개 변수가 제대로 채워지지 않습니다 (즉, /bla(bla)?/:value채워지지 않음 req.params.value). 왜 그럴까요?
joscarsson

당신이 사용하는 경우 당신이 그것을 얻을 수있는 표현 req.params.var하지만 당신은 당신이 한 할 필요가 req함수에 전달
매트 닌자를

51

언급 한 것처럼 실제로 경로 배열을 전달할 수 있으며 훌륭하게 작동합니다.

var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);

28
더 이상 사용되지 않는 대체품은 무엇입니까?
brandonscript 2014

5
@JonathanOng 당신은 이것이 더 이상 사용되지 않는다고 말했고 , remus대체물 이 무엇인지 묻고 있습니다. 질문에 답해 주시겠습니까?
nbro

router.route ([ '/ mailer / out / system', '/ mailer / out / payment'])는 Express 4에서 잘 작동합니다. 사용 중단 경고 없음
danday74

2
배열을 사용하여 현재 Express v4 문서를 보는 @JonathanOng는 더 이상 사용되지 않는 것으로 보입니다.
Jason Axelson

32

Kevin의 답변 에 대해 자세히 설명하기 위해 이것은 4.x 문서 에서 가져온 것입니다 .

미들웨어 기능이 호출되는 경로입니다. 다음 중 하나 일 수 있습니다.

  • 경로를 나타내는 문자열입니다.
  • 경로 패턴.
  • 경로와 일치하는 정규식 패턴입니다.
  • 위의 조합의 배열입니다.

다음 과 같은 몇 가지 예가 있습니다 .

이 경로로 시작하는 일치 /abcd, /xyza, /lmn, 및 /pqr:

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


-2

원래 경로의 파일이 필요하고 다음과 같이 새 경로를 정의하십시오.

var user = require('./users');
router.post('/login', user.post('/login'));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.