[node.js] Express에서 등록 된 모든 경로를 얻는 방법은 무엇입니까?

Node.js 및 Express를 사용하여 작성된 웹 응용 프로그램이 있습니다. 이제 등록 된 모든 경로를 적절한 방법으로 나열하고 싶습니다.

예를 들어 내가 처형했다면

app.get('/', function (...) { ... });
app.get('/foo/:id', function (...) { ... });
app.post('/foo/:id', function (...) { ... });

다음과 같은 객체 (또는 그와 동등한 것)를 검색하고 싶습니다.

{
  get: [ '/', '/foo/:id' ],
  post: [ '/foo/:id' ]
}

이것이 가능합니까? 그렇다면 가능합니까?


업데이트 : 한편, 주어진 응용 프로그램에서 경로 를 추출하는 get-routes 라는 npm 패키지를 만들었습니다 .이 문제를 해결합니다. 현재 Express 4.x 만 지원되지만 지금은 괜찮습니다. 참고로



답변

3.x를 표현하다

좋아, 나 자신을 발견했다 … 그것은 단지 app.routes🙂

4.x를 표현하십시오

응용 프로그램 -내장express()

app._router.stack

라우터 -내장express.Router()

router.stack

참고 : 스택에는 미들웨어 기능도 포함되어 있으므로 “라우트” 만 가져 오도록 필터링해야합니다 .


답변

app._router.stack.forEach(function(r){
  if (r.route && r.route.path){
    console.log(r.route.path)
  }
})


답변

앱에 직접 등록 된 경로 (app.VERB를 통해)와 라우터 미들웨어로 등록 된 경로 (app.use를 통해)를 가져옵니다. 익스프레스 4.11.0

//////////////
app.get("/foo", function(req,res){
    res.send('foo');
});

//////////////
var router = express.Router();

router.get("/bar", function(req,res,next){
    res.send('bar');
});

app.use("/",router);


//////////////
var route, routes = [];

app._router.stack.forEach(function(middleware){
    if(middleware.route){ // routes registered directly on the app
        routes.push(middleware.route);
    } else if(middleware.name === 'router'){ // router middleware 
        middleware.handle.stack.forEach(function(handler){
            route = handler.route;
            route && routes.push(route);
        });
    }
});

// routes:
// {path: "/foo", methods: {get: true}}
// {path: "/bar", methods: {get: true}}


답변

더 이상 내 필요에 맞지 않는 오래된 게시물을 수정했습니다. express.Router ()를 사용하고 다음과 같이 내 경로를 등록했습니다.

var questionsRoute = require('./BE/routes/questions');
app.use('/api/questions', questionsRoute);

apiTable.js에서 document.js 파일의 이름을 바꾸고 다음과 같이 수정했습니다.

module.exports =  function (baseUrl, routes) {
    var Table = require('cli-table');
    var table = new Table({ head: ["", "Path"] });
    console.log('\nAPI for ' + baseUrl);
    console.log('\n********************************************');

    for (var key in routes) {
        if (routes.hasOwnProperty(key)) {
            var val = routes[key];
            if(val.route) {
                val = val.route;
                var _o = {};
                _o[val.stack[0].method]  = [baseUrl + val.path];
                table.push(_o);
            }
        }
    }

    console.log(table.toString());
    return table;
};

그런 다음 server.js에서 다음과 같이 호출합니다.

var server = app.listen(process.env.PORT || 5000, function () {
    require('./BE/utils/apiTable')('/api/questions', questionsRoute.stack);
});

결과는 다음과 같습니다.

결과 예

이것은 단지 예일 뿐이지 만 유용 할 수 있습니다 .. 희망합니다 ..


답변

Express 4.x에서 등록 된 경로를 얻는 데 사용하는 작은 내용은 다음과 같습니다.

app._router.stack          // registered routes
  .filter(r => r.route)    // take out all the middleware
  .map(r => r.route.path)  // get all the paths


답변

DEBUG=express:* node index.js

위 명령으로 앱을 실행하면 DEBUG모듈로 앱을 시작 하고 경로와 사용중인 모든 미들웨어 기능을 제공합니다.

ExpressJS-디버깅디버그를 참조하십시오 .


답변

특급 github 문제 에 대한 Doug Wilson 의 해시 복사 / 붙여 넣기 답변 . 더럽지 만 매력처럼 작동합니다.

function print (path, layer) {
  if (layer.route) {
    layer.route.stack.forEach(print.bind(null, path.concat(split(layer.route.path))))
  } else if (layer.name === 'router' && layer.handle.stack) {
    layer.handle.stack.forEach(print.bind(null, path.concat(split(layer.regexp))))
  } else if (layer.method) {
    console.log('%s /%s',
      layer.method.toUpperCase(),
      path.concat(split(layer.regexp)).filter(Boolean).join('/'))
  }
}

function split (thing) {
  if (typeof thing === 'string') {
    return thing.split('/')
  } else if (thing.fast_slash) {
    return ''
  } else {
    var match = thing.toString()
      .replace('\\/?', '')
      .replace('(?=\\/|$)', '$')
      .match(/^\/\^((?:\\[.*+?^${}()|[\]\\\/]|[^.*+?^${}()|[\]\\\/])*)\$\//)
    return match
      ? match[1].replace(/\\(.)/g, '$1').split('/')
      : '<complex:' + thing.toString() + '>'
  }
}

app._router.stack.forEach(print.bind(null, []))

생산

스크린