Làm thế nào để có được tất cả các tuyến đã đăng ký trong Express?


181

Tôi có một ứng dụng web được xây dựng bằng Node.js và Express. Bây giờ tôi muốn liệt kê tất cả các tuyến đã đăng ký với các phương pháp thích hợp của họ.

Ví dụ, nếu tôi đã thực hiện

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

Tôi muốn lấy một đối tượng (hoặc một cái gì đó tương đương với điều đó), chẳng hạn như:

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

Điều này là có thể, và nếu vậy, làm thế nào?


CẬP NHẬT: Trong khi đó, tôi đã tạo ra một gói npm được gọi là get-tuyến trích xuất các tuyến từ một ứng dụng nhất định, giải quyết vấn đề này. Hiện tại, chỉ có Express 4.x được hỗ trợ, nhưng tôi đoán bây giờ điều này là tốt. Chỉ cần FYI.


Tất cả các giải pháp tôi đã thử, không hoạt động khi bạn đã xác định Bộ định tuyến. Nó chỉ hoạt động trên mỗi tuyến đường - không cung cấp cho tôi toàn bộ url cho tuyến đường đó trong ứng dụng của tôi ...
anh chàng mograbi

1
@guymograbi bạn có thể muốn xem stackoverflow.com/a/55589657/6693775
nbsamar

Câu trả lời:


230

thể hiện 3.x

Được rồi, tự tìm nó ... chỉ là app.routes:-)

thể hiện 4.x

Ứng dụng - được xây dựng vớiexpress()

app._router.stack

Bộ định tuyến - được xây dựng vớiexpress.Router()

router.stack

Lưu ý : Ngăn xếp bao gồm các chức năng phần mềm trung gian, nó nên được lọc để chỉ nhận "tuyến đường" .


Tôi đang sử dụng nút 0.10 và đó là app.routes.routes- điều đó có nghĩa là tôi có thể thực hiện JSON.opesify (app.routes.routes)
anh chàng mograbi

7
Chỉ hoạt động cho Express 3.x, không phải 4.x. Trong 4.x, bạn nên kiểm traapp._router.stack
avetisk

14
Điều này đã không làm việc như mong đợi đối với tôi. app._router dường như không bao gồm các tuyến đường từ app.use ('/ path', otherRouter);
Michael Cole

Có một số cách mà điều này có thể được tích hợp với một tập lệnh dòng lệnh sẽ kéo theo chính xác các tệp tuyến đường mà ứng dụng trực tiếp thực hiện mà không thực sự bắt đầu một ứng dụng web?
Lawrence I. Siden

5
Ít nhất trong express 4.13.1 app._router.stacklà không xác định.
levigroker

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

1
Lưu ý rằng nếu bạn đang sử dụng một cái gì đó như Express Router (hoặc phần mềm trung gian khác), bạn sẽ thấy @Caleb trả lời dài hơn một chút mở rộng về phương pháp này.
Iain Collins

31

Điều này nhận các tuyến được đăng ký trực tiếp trên ứng dụng (thông qua app.VERB) và các tuyến được đăng ký làm phần mềm trung gian của bộ định tuyến (thông qua app.use). Thể hiện 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}}

1
Tuyệt vời, cảm ơn vì một ví dụ cho thấy cách đặt các tuyến hiển thị được đặt qua phần mềm trung gian như bộ định tuyến Express.
Iain Collins

31

Tôi đã điều chỉnh một bài viết cũ không còn trực tuyến cho nhu cầu của tôi. Tôi đã sử dụng express.Router () và đã đăng ký các tuyến đường của mình như thế này:

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

Tôi đã đổi tên tệp document.js trong apiTable.js và điều chỉnh nó như thế này:

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;
};

sau đó tôi gọi nó trong server.js của tôi như thế này:

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

Kết quả trông như thế này:

Ví dụ kết quả

Nó chỉ là một ví dụ nhưng có thể được sử dụng .. tôi hy vọng ..


2
Điều này không hoạt động đối với các tuyến đường lồng nhau như được xác định ở đây: stackoverflow.com/questions/25260818/NH

2
Hãy coi chừng các liên kết trong câu trả lời này! Nó chuyển hướng tôi đến một trang web ngẫu nhiên và buộc tải xuống máy tính của tôi.
Tyler Bell

29

Đây là một điều nhỏ tôi sử dụng chỉ để có được các đường dẫn đã đăng ký trong 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

console.log (server._router.stack.map (r => r.route) .filter (r => r) .map (r => ${Object.keys(r.methods).join(', ')} ${r.path}))
standup75

Bạn đặt cái này ở đâu, trong app.js ??
Juan

21

DEBUG=express:* node index.js

Nếu bạn chạy ứng dụng của mình bằng lệnh trên, nó sẽ khởi chạy ứng dụng của bạn với DEBUGmô-đun và đưa ra các tuyến đường, cộng với tất cả các chức năng phần mềm trung gian đang sử dụng.

Bạn có thể tham khảo: ExpressJS - Gỡ lỗigỡ lỗi .


3
Cho đến nay câu trả lời tốt nhất ... một env var!
Jeef

Thật vậy, câu trả lời hữu ích nhất. @nbsamar Bạn thậm chí có thể mở rộng nó để sử dụng DEBUG=express:pathsđể chỉ xem đầu ra đường dẫn và không phải tất cả các thông báo gỡ lỗi khác. Cảm ơn!
Đánh dấu Edington

19

Hacky sao chép / dán câu trả lời lịch sự của Doug Wilson về các vấn đề github thể hiện . Bẩn nhưng hoạt động như một lá bùa.

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, []))

Sản xuất

màn hình


Tại sao các tuyến đường không khác biệt?
Vladimir Vukanac

1
Đây là người duy nhất làm việc với tôi với Express 4.15. Không ai trong số những người khác đưa ra con đường đầy đủ. Nhắc nhở duy nhất là nó không trả lại đường dẫn gốc mặc định / - không ai trong số họ làm.
Shane

Tôi không hiểu tại sao bạn ràng buộc tranh luận với print?
ZzZombo

@ZzZombo hỏi Doug Wilson, anh ấy đã viết nó. Bạn có thể có thể làm sạch tất cả điều này nếu bạn muốn.
AlienWebguy

11

https://www.npmjs.com/package/express-list-endpoint hoạt động khá tốt.

Thí dụ

Sử dụng:

const all_routes = require('express-list-endpoints');
console.log(all_routes(app));

Đầu ra:

[ { path: '*', methods: [ 'OPTIONS' ] },
  { path: '/', methods: [ 'GET' ] },
  { path: '/sessions', methods: [ 'POST' ] },
  { path: '/sessions', methods: [ 'DELETE' ] },
  { path: '/users', methods: [ 'GET' ] },
  { path: '/users', methods: [ 'POST' ] } ]

2
Điều này không hoạt động với: server = express(); app1 = express(); server.use('/app1', app1); ...
Danosaure

8

Một chức năng ghi nhật ký tất cả các tuyến trong express 4 (có thể dễ dàng điều chỉnh cho v3 ~)

function space(x) {
    var res = '';
    while(x--) res += ' ';
    return res;
}

function listRoutes(){
    for (var i = 0; i < arguments.length;  i++) {
        if(arguments[i].stack instanceof Array){
            console.log('');
            arguments[i].stack.forEach(function(a){
                var route = a.route;
                if(route){
                    route.stack.forEach(function(r){
                        var method = r.method.toUpperCase();
                        console.log(method,space(8 - method.length),route.path);
                    })
                }
            });
        }
    }
}

listRoutes(router, routerAuth, routerHTML);

Nhật ký đầu ra:

GET       /isAlive
POST      /test/email
POST      /user/verify

PUT       /login
POST      /login
GET       /player
PUT       /player
GET       /player/:id
GET       /players
GET       /system
POST      /user
GET       /user
PUT       /user
DELETE    /user

GET       /
GET       /login

Biến nó thành NPM https://www.npmjs.com/package/express-list-routes


1
Điều này đã không làm việc như mong đợi đối với tôi. app._router dường như không bao gồm các tuyến đường từ app.use ('/ path', otherRouter);
Michael Cole

@MichaelCole Bạn đã xem câu trả lời dưới đây từ Golo Roden chưa?
Labithiotis

@ Dazzler13 Tôi đã chơi với nó trong một giờ và không thể làm cho nó hoạt động được. Thể hiện 4.0. Đã tạo ứng dụng, tạo bộ định tuyến, app.use (đường dẫn, bộ định tuyến), các tuyến bộ định tuyến không xuất hiện trong app._router. Thí dụ?
Michael Cole

Ví dụ từ @Caleb bên dưới hoạt động tốt cho các tuyến được xử lý với nội dung như express.Router nếu đó là vấn đề của bạn. Lưu ý rằng các tuyến được thiết lập với phần mềm trung gian (bao gồm express.Router) có thể không hiển thị ngay lập tức và bạn có thể cần thêm một độ trễ ngắn trước khi kiểm tra chúng trong app._router (thậm chí sử dụng cách tiếp cận từ @Caleb).
Iain Collins

8

đầu ra json

function availableRoutes() {
  return app._router.stack
    .filter(r => r.route)
    .map(r => {
      return {
        method: Object.keys(r.route.methods)[0].toUpperCase(),
        path: r.route.path
      };
    });
}

console.log(JSON.stringify(availableRoutes(), null, 2));

trông như thế này:

[
  {
    "method": "GET",
    "path": "/api/todos"
  },
  {
    "method": "POST",
    "path": "/api/todos"
  },
  {
    "method": "PUT",
    "path": "/api/todos/:id"
  },
  {
    "method": "DELETE",
    "path": "/api/todos/:id"
  }
]

đầu ra chuỗi

function availableRoutesString() {
  return app._router.stack
    .filter(r => r.route)
    .map(r => Object.keys(r.route.methods)[0].toUpperCase().padEnd(7) + r.route.path)
    .join("\n  ")
}

console.log(availableRoutesString());

trông như thế này:

GET    /api/todos  
POST   /api/todos  
PUT    /api/todos/:id  
DELETE /api/todos/:id

những điều này dựa trên câu trả lời của @ corvid

hi vọng điêu nay co ich


5

Tôi đã được truyền cảm hứng từ các tuyến đường trong danh sách nhanh của Labithiotis, nhưng tôi muốn có một cái nhìn tổng quan về tất cả các tuyến đường và các url của mình trong một lần, và không chỉ định một bộ định tuyến và tìm ra tiền tố mỗi lần. Một cái gì đó tôi đã nghĩ ra chỉ đơn giản là thay thế chức năng app.use bằng chức năng của riêng tôi, nơi lưu trữ baseUrl và bộ định tuyến đã cho. Từ đó tôi có thể in bất kỳ bảng nào trong tất cả các tuyến đường của mình.

LƯU Ý điều này hoạt động với tôi vì tôi khai báo các tuyến của mình trong tệp (chức năng) tuyến cụ thể được truyền trong đối tượng ứng dụng, như sau:

// index.js
[...]
var app = Express();
require(./config/routes)(app);

// ./config/routes.js
module.exports = function(app) {
    // Some static routes
    app.use('/users', [middleware], UsersRouter);
    app.use('/users/:user_id/items', [middleware], ItemsRouter);
    app.use('/otherResource', [middleware], OtherResourceRouter);
}

Điều này cho phép tôi vượt qua trong một đối tượng 'ứng dụng' khác có chức năng sử dụng giả và tôi có thể nhận được TẤT CẢ các tuyến đường. Điều này làm việc cho tôi (đã loại bỏ một số kiểm tra lỗi cho rõ ràng, nhưng vẫn hoạt động cho ví dụ):

// In printRoutes.js (or a gulp task, or whatever)
var Express = require('express')
  , app     = Express()
  , _       = require('lodash')

// Global array to store all relevant args of calls to app.use
var APP_USED = []

// Replace the `use` function to store the routers and the urls they operate on
app.use = function() {
  var urlBase = arguments[0];

  // Find the router in the args list
  _.forEach(arguments, function(arg) {
    if (arg.name == 'router') {
      APP_USED.push({
        urlBase: urlBase,
        router: arg
      });
    }
  });
};

// Let the routes function run with the stubbed app object.
require('./config/routes')(app);

// GRAB all the routes from our saved routers:
_.each(APP_USED, function(used) {
  // On each route of the router
  _.each(used.router.stack, function(stackElement) {
    if (stackElement.route) {
      var path = stackElement.route.path;
      var method = stackElement.route.stack[0].method.toUpperCase();

      // Do whatever you want with the data. I like to make a nice table :)
      console.log(method + " -> " + used.urlBase + path);
    }
  });
});

Ví dụ đầy đủ này (với một số bộ định tuyến CRUD cơ bản) vừa được thử nghiệm và in ra:

GET -> /users/users
GET -> /users/users/:user_id
POST -> /users/users
DELETE -> /users/users/:user_id
GET -> /users/:user_id/items/
GET -> /users/:user_id/items/:item_id
PUT -> /users/:user_id/items/:item_id
POST -> /users/:user_id/items/
DELETE -> /users/:user_id/items/:item_id
GET -> /otherResource/
GET -> /otherResource/:other_resource_id
POST -> /otherResource/
DELETE -> /otherResource/:other_resource_id

Sử dụng bảng cli tôi nhận được một cái gì đó như thế này:

┌────────┬───────────────────────┐
         => Users              
├────────┼───────────────────────┤
 GET     /users/users          
├────────┼───────────────────────┤
 GET     /users/users/:user_id 
├────────┼───────────────────────┤
 POST    /users/users          
├────────┼───────────────────────┤
 DELETE  /users/users/:user_id 
└────────┴───────────────────────┘
┌────────┬────────────────────────────────┐
         => Items                       
├────────┼────────────────────────────────┤
 GET     /users/:user_id/items/         
├────────┼────────────────────────────────┤
 GET     /users/:user_id/items/:item_id 
├────────┼────────────────────────────────┤
 PUT     /users/:user_id/items/:item_id 
├────────┼────────────────────────────────┤
 POST    /users/:user_id/items/         
├────────┼────────────────────────────────┤
 DELETE  /users/:user_id/items/:item_id 
└────────┴────────────────────────────────┘
┌────────┬───────────────────────────────────┐
         => OtherResources                 
├────────┼───────────────────────────────────┤
 GET     /otherResource/                   
├────────┼───────────────────────────────────┤
 GET     /otherResource/:other_resource_id 
├────────┼───────────────────────────────────┤
 POST    /otherResource/                   
├────────┼───────────────────────────────────┤
 DELETE  /otherResource/:other_resource_id 
└────────┴───────────────────────────────────┘

Mà đá đít.


4

Thể hiện 4

Đưa ra cấu hình Express 4 với các điểm cuối và bộ định tuyến lồng nhau

const express = require('express')
const app = express()
const router = express.Router()

app.get(...)
app.post(...)

router.use(...)
router.get(...)
router.post(...)

app.use(router)

Mở rộng câu trả lời @caleb có thể nhận được tất cả các tuyến theo cách đệ quy và sắp xếp.

getRoutes(app._router && app._router.stack)
// =>
// [
//     [ 'GET', '/'], 
//     [ 'POST', '/auth'],
//     ...
// ]

/**
* Converts Express 4 app routes to an array representation suitable for easy parsing.
* @arg {Array} stack An Express 4 application middleware list.
* @returns {Array} An array representation of the routes in the form [ [ 'GET', '/path' ], ... ].
*/
function getRoutes(stack) {
        const routes = (stack || [])
                // We are interested only in endpoints and router middleware.
                .filter(it => it.route || it.name === 'router')
                // The magic recursive conversion.
                .reduce((result, it) => {
                        if (! it.route) {
                                // We are handling a router middleware.
                                const stack = it.handle.stack
                                const routes = getRoutes(stack)

                                return result.concat(routes)
                        }

                        // We are handling an endpoint.
                        const methods = it.route.methods
                        const path = it.route.path

                        const routes = Object
                                .keys(methods)
                                .map(m => [ m.toUpperCase(), path ])

                        return result.concat(routes)
                }, [])
                // We sort the data structure by route path.
                .sort((prev, next) => {
                        const [ prevMethod, prevPath ] = prev
                        const [ nextMethod, nextPath ] = next

                        if (prevPath < nextPath) {
                                return -1
                        }

                        if (prevPath > nextPath) {
                                return 1
                        }

                        return 0
                })

        return routes
}

Đối với đầu ra chuỗi cơ bản.

infoAboutRoutes(app)

Bảng điều khiển đầu ra

/**
* Converts Express 4 app routes to a string representation suitable for console output.
* @arg {Object} app An Express 4 application
* @returns {string} A string representation of the routes.
*/
function infoAboutRoutes(app) {
        const entryPoint = app._router && app._router.stack
        const routes = getRoutes(entryPoint)

        const info = routes
                .reduce((result, it) => {
                        const [ method, path ] = it

                        return result + `${method.padEnd(6)} ${path}\n`
                }, '')

        return info
}

Cập nhật 1:

Do những hạn chế bên trong của Express 4, không thể truy xuất ứng dụng được gắn và bộ định tuyến được gắn. Ví dụ, không thể có được các tuyến đường từ cấu hình này.

const subApp = express()
app.use('/sub/app', subApp)

const subRouter = express.Router()
app.use('/sub/route', subRouter)

Các tuyến đường được liệt kê hoạt động với gói này: github.com/AlbertoFdzM/express-list-endpoint
jsaddwater

4

Cần một số điều chỉnh nhưng nên hoạt động cho Express v4. Bao gồm những tuyến đường được thêm vào .use().

function listRoutes(routes, stack, parent){

  parent = parent || '';
  if(stack){
    stack.forEach(function(r){
      if (r.route && r.route.path){
        var method = '';

        for(method in r.route.methods){
          if(r.route.methods[method]){
            routes.push({method: method.toUpperCase(), path: parent + r.route.path});
          }
        }       

      } else if (r.handle && r.handle.name == 'router') {
        const routerName = r.regexp.source.replace("^\\","").replace("\\/?(?=\\/|$)","");
        return listRoutes(routes, r.handle.stack, parent + routerName);
      }
    });
    return routes;
  } else {
    return listRoutes([], app._router.stack);
  }
}

//Usage on app.js
const routes = listRoutes(); //array: ["method: path", "..."]

chỉnh sửa: cải tiến mã


3

Một chút cập nhật và tiếp cận nhiều chức năng hơn cho câu trả lời của @ prranay:

const routes = app._router.stack
    .filter((middleware) => middleware.route)
    .map((middleware) => `${Object.keys(middleware.route.methods).join(', ')} -> ${middleware.route.path}`)

console.log(JSON.stringify(routes, null, 4));

2

Điều này làm việc cho tôi

let routes = []
app._router.stack.forEach(function (middleware) {
    if(middleware.route) {
        routes.push(Object.keys(middleware.route.methods) + " -> " + middleware.route.path);
    }
});

console.log(JSON.stringify(routes, null, 4));

O / P:

[
    "get -> /posts/:id",
    "post -> /posts",
    "patch -> /posts"
]

2

Khởi tạo bộ định tuyến tốc hành

let router = require('express').Router();
router.get('/', function (req, res) {
    res.json({
        status: `API Its Working`,
        route: router.stack.filter(r => r.route)
           .map(r=> { return {"path":r.route.path, 
 "methods":r.route.methods}}),
        message: 'Welcome to my crafted with love!',
      });
   });   

Nhập bộ điều khiển người dùng

var userController = require('./controller/userController');

Tuyến người dùng

router.route('/users')
   .get(userController.index)
   .post(userController.new);
router.route('/users/:user_id')
   .get(userController.view)
   .patch(userController.update)
   .put(userController.update)
   .delete(userController.delete);

Xuất các tuyến API

module.exports = router;

Đầu ra

{"status":"API Its Working, APP Route","route": 
[{"path":"/","methods":{"get":true}}, 
{"path":"/users","methods":{"get":true,"post":true}}, 
{"path":"/users/:user_id","methods": ....}

1

Trên Express 3.5.x, tôi thêm phần này trước khi bắt đầu ứng dụng để in các tuyến đường trên thiết bị đầu cuối của mình:

var routes = app.routes;
for (var verb in routes){
    if (routes.hasOwnProperty(verb)) {
      routes[verb].forEach(function(route){
        console.log(verb + " : "+route['path']);
      });
    }
}

Có lẽ nó có thể giúp ...


1

Bạn có thể triển khai /get-all-routesAPI:

const express = require("express");
const app = express();

app.get("/get-all-routes", (req, res) => {  
  let get = app._router.stack.filter(r => r.route && r.route.methods.get).map(r => r.route.path);
  let post = app._router.stack.filter(r => r.route && r.route.methods.post).map(r => r.route.path);
  res.send({ get: get, post: post });
});

const listener = app.listen(process.env.PORT, () => {
  console.log("Your app is listening on port " + listener.address().port);
});

Đây là bản demo: https://glitch.com/edit/#!/get-all-routes-in-nodejs


0

Vì vậy, tôi đã xem xét tất cả các câu trả lời .. không giống như hầu hết .. đã lấy một số từ một vài .. thực hiện điều này:

const resolveRoutes = (stack) => {
  return stack.map(function (layer) {
    if (layer.route && layer.route.path.isString()) {
      let methods = Object.keys(layer.route.methods);
      if (methods.length > 20)
        methods = ["ALL"];

      return {methods: methods, path: layer.route.path};
    }

    if (layer.name === 'router')  // router middleware
      return resolveRoutes(layer.handle.stack);

  }).filter(route => route);
};

const routes = resolveRoutes(express._router.stack);
const printRoute = (route) => {
  if (Array.isArray(route))
    return route.forEach(route => printRoute(route));

  console.log(JSON.stringify(route.methods) + " " + route.path);
};

printRoute(routes);

không phải là đẹp nhất .. nhưng lồng nhau, và thực hiện các mẹo

cũng lưu ý 20 ở đó ... Tôi chỉ cho rằng sẽ không có một tuyến đường bình thường với 20 phương thức .. vì vậy tôi suy luận đó là tất cả ..


0

chi tiết tuyến đường là tuyến đường liệt kê cho "express": "4.xx",

import {
  Router
} from 'express';
var router = Router();

router.get("/routes", (req, res, next) => {
  var routes = [];
  var i = 0;
  router.stack.forEach(function (r) {
    if (r.route && r.route.path) {
      r.route.stack.forEach(function (type) {
        var method = type.method.toUpperCase();
        routes[i++] = {
          no:i,
          method: method.toUpperCase(),
          path: r.route.path
        };
      })
    }
  })

  res.send('<h1>List of routes.</h1>' + JSON.stringify(routes));
});

ĐẦU RA ĐƠN GIẢN

List of routes.

[
{"no":1,"method":"POST","path":"/admin"},
{"no":2,"method":"GET","path":"/"},
{"no":3,"method":"GET","path":"/routes"},
{"no":4,"method":"POST","path":"/student/:studentId/course/:courseId/topic/:topicId/task/:taskId/item"},
{"no":5,"method":"GET","path":"/student/:studentId/course/:courseId/topic/:topicId/task/:taskId/item"},
{"no":6,"method":"PUT","path":"/student/:studentId/course/:courseId/topic/:topicId/task/:taskId/item/:itemId"},
{"no":7,"method":"DELETE","path":"/student/:studentId/course/:courseId/topic/:topicId/task/:taskId/item/:itemId"}
]

0

Chỉ cần sử dụng gói npm này, nó sẽ cung cấp đầu ra web cũng như đầu ra đầu cuối trong chế độ xem bảng được định dạng đẹp.

nhập mô tả hình ảnh ở đây

https://www.npmjs.com/package/express-routes-catalogue


2
Gói này có tấn chấp nhận nhiều hơn. npmjs.com/package/express-list-endpoint . Tôi là 21.111 so với 34 lượt tải hàng tuần. Tuy nhiên, express-routes-cataloguecũng hiển thị các tuyến dưới dạng HTML, nhưng lại không hiển thị các tuyến khác.
mayid

1
không tệ, tài liệu của gói khác với tên gói thực tế khi yêu cầu và gói này giống như tất cả các gói khác được đề cập chỉ hiển thị các tuyến đường một lớp có bao gồm
hamza khan

@hamzakhan ps cảm ơn đã cập nhật. Tôi là tác giả, sẽ sớm được cập nhật trong tài liệu.
Vijay

-1

Đây là chức năng một dòng để in đẹp các tuyến đường trong Express app:

const getAppRoutes = (app) => app._router.stack.reduce(
  (acc, val) => acc.concat(
    val.route ? [val.route.path] :
      val.name === "router" ? val.handle.stack.filter(
        x => x.route).map(
          x => val.regexp.toString().match(/\/[a-z]+/)[0] + (
            x.route.path === '/' ? '' : x.route.path)) : []) , []).sort();

-2

Tôi đã xuất bản một gói in tất cả các phần mềm trung gian cũng như các tuyến đường, thực sự hữu ích khi cố gắng kiểm toán một ứng dụng cấp tốc. Bạn gắn gói như là phần mềm trung gian, để nó tự in ra:

https://github.com/ErisDS/middleware-stack-printer

Nó in một loại cây như:

- middleware 1
- middleware 2
- Route /thing/
- - middleware 3
- - controller (HTTP VERB)  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.