วิธีรับเส้นทางที่ลงทะเบียนทั้งหมดใน Express


181

ฉันมีเว็บแอปพลิเคชั่นที่สร้างขึ้นโดยใช้ Node.js และ Express ตอนนี้ฉันต้องการจะแสดงรายการเส้นทางที่ลงทะเบียนทั้งหมดด้วยวิธีการที่เหมาะสม

เช่นถ้าฉันได้ประหารชีวิต

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

ฉันต้องการดึงวัตถุ (หรือสิ่งที่เทียบเท่า) เช่น:

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

เป็นไปได้และถ้าเป็นเช่นนั้นได้อย่างไร


อัปเดต:ในขณะเดียวกันฉันได้สร้างแพ็กเกจ npm ที่เรียกว่าget- route ซึ่งแยกเส้นทางออกจากแอปพลิเคชันที่กำหนดซึ่งจะแก้ปัญหานี้ได้ ปัจจุบันรองรับเฉพาะ Express 4.x แต่ฉันเดาว่าตอนนี้ใช้ได้แล้ว เพียงแค่ FYI


วิธีแก้ปัญหาทั้งหมดที่ฉันพยายามไม่ทำงานเมื่อคุณกำหนดเราเตอร์ ใช้งานได้ต่อเส้นทางเท่านั้น - ซึ่งไม่ได้ให้ URL ทั้งหมดสำหรับเส้นทางนั้นในแอปของฉัน ...
guy mograbi

1
@guymograbi คุณอาจต้องการที่จะดูที่stackoverflow.com/a/55589657/6693775
nbsamar

คำตอบ:


230

ด่วน 3.x

โอเคพบด้วยตัวเอง ... มันแค่app.routes:-)

ด่วน 4.x

แอพพลิเคชั่น - สร้างขึ้นด้วยexpress()

app._router.stack

เราเตอร์ - สร้างด้วยexpress.Router()

router.stack

หมายเหตุ : สแต็กรวมถึงฟังก์ชั่นมิดเดิลแวร์ด้วยเช่นกันควรได้รับการกรองเพื่อรับ"เส้นทาง"เท่านั้น


ฉันใช้โหนด 0.10 และมันก็app.routes.routes- ซึ่งหมายความว่าฉันสามารถทำ JSON.stringify (app.routes.routes)
guy mograbi

7
ใช้งานได้กับ Express 3.x เท่านั้นไม่ใช่ 4.x ใน 4.x คุณควรตรวจสอบapp._router.stack
avetisk

14
สิ่งนี้ไม่ทำงานตามที่คาดไว้สำหรับฉัน app._router ดูเหมือนจะไม่มีเส้นทางจาก app.use ('/ path', otherRouter);
Michael Cole

มีวิธีใดบ้างที่สิ่งนี้สามารถรวมเข้ากับสคริปต์บรรทัดคำสั่งที่จะดึงไฟล์เส้นทางเดียวกันกับที่แอปจริงทำโดยไม่ต้องเริ่มแอปพลิเคชันบนเว็บจริง ๆ
Lawrence I. Siden

5
อย่างน้อยใน express 4.13.1 app._router.stackไม่ได้ถูกกำหนดไว้
levigroker

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

1
โปรดทราบว่าหากคุณกำลังใช้บางอย่างเช่น Express Router (หรือมิดเดิลแวร์อื่น ๆ ) คุณควรเห็น @Caleb คำตอบที่ยาวกว่าเล็กน้อยซึ่งขยายในแนวทางนี้
เลนคอลลินส์

31

สิ่งนี้จะได้รับเส้นทางที่ลงทะเบียนโดยตรงบนแอป (ผ่าน 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}}

1
ยอดเยี่ยมขอบคุณสำหรับตัวอย่างที่แสดงวิธีการกำหนดเส้นทางการแสดงผลผ่านมิดเดิลแวร์เช่นเราเตอร์ด่วน
เลนคอลลินส์

31

ฉันได้ดัดแปลงโพสต์เก่าที่ไม่ได้ออนไลน์อีกต่อไปสำหรับความต้องการของฉัน ฉันใช้ express.Router () และลงทะเบียนเส้นทางของฉันเช่นนี้:

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

ฉันเปลี่ยนชื่อไฟล์ document.js เป็น apiTable.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);
});

ผลลัพธ์จะเป็นดังนี้:

ตัวอย่างผลลัพธ์

เป็นเพียงตัวอย่าง แต่อาจมีการใช้ .. ฉันหวังว่า ..


2
วิธีนี้ใช้ไม่ได้กับเส้นทางที่ซ้อนกันตามที่ระบุไว้ที่นี่: stackoverflow.com/questions/25260818/ …

2
ระวังลิงก์ในคำตอบนี้! มันนำฉันไปยังเว็บไซต์สุ่มและบังคับให้ดาวน์โหลดไปยังคอมพิวเตอร์ของฉัน
Tyler Bell

29

นี่คือสิ่งเล็กน้อยที่ฉันใช้เพื่อรับเส้นทางที่ลงทะเบียนใน 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

คุณใส่นี่ไว้ที่ไหนใน app.js
Juan

21

DEBUG=express:* node index.js

หากคุณเรียกใช้แอปของคุณด้วยคำสั่งด้านบนแอปจะเปิดใช้แอปของคุณด้วยDEBUGโมดูลและกำหนดเส้นทางรวมถึงฟังก์ชั่นมิดเดิลแวร์ทั้งหมดที่ใช้งานอยู่

คุณสามารถดู: ExpressJS - การแก้ไขข้อบกพร่องและการแก้ปัญหา


3
โดยคำตอบที่ดีที่สุด ... หนึ่ง env var!
Jeef

แน่นอนคำตอบที่มีประโยชน์ที่สุด @nbsamar คุณอาจขยายเพื่อบอกว่าจะใช้DEBUG=express:pathsเพื่อดูเฉพาะเอาต์พุตพา ธ และไม่ใช่ข้อความดีบักอื่น ๆ ทั้งหมด ขอบคุณ!
Mark Edington

19

สำเนา Hacky / วางคำตอบมารยาทของดั๊กวิลสันในประเด็น GitHub ด่วน สกปรก แต่ทำงานเหมือนจับใจ

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

ผลิต

Screengrab


เหตุใดเส้นทางจึงไม่แตกต่างกัน
Vladimir Vukanac

1
นี่เป็นคนเดียวที่ทำงานกับฉันด้วย Express 4.15 ไม่มีผู้อื่นให้เส้นทางเต็ม ข้อแม้เดียวก็คือว่ามันไม่ได้ให้กลับเส้นทางรากเริ่มต้น / - ไม่มีพวกเขาทำ
เชน

ฉันไม่เข้าใจว่าทำไมคุณถึงผูกข้อโต้แย้งprint?
ZzZombo

@ZZZombo ถามดั๊กวิลสันเขาเขียนมัน คุณสามารถล้างทั้งหมดนี้ได้ถ้าต้องการ
AlienWebguy

11

https://www.npmjs.com/package/express-list-endpoints ใช้งานได้ดีทีเดียว

ตัวอย่าง

การใช้งาน:

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

เอาท์พุท:

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

2
สิ่งนี้ใช้ไม่ได้กับ: server = express(); app1 = express(); server.use('/app1', app1); ...
Danosaure

8

ฟังก์ชั่นเพื่อบันทึกเส้นทางทั้งหมดใน express 4 (สามารถปรับแต่งได้อย่างง่ายดายสำหรับ 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);

บันทึกเอาท์พุท:

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

ทำให้เป็น NPM https://www.npmjs.com/package/express-list-routes


1
สิ่งนี้ไม่ทำงานตามที่คาดไว้สำหรับฉัน app._router ดูเหมือนจะไม่มีเส้นทางจาก app.use ('/ path', otherRouter);
Michael Cole

@MichaelCole คุณดูคำตอบด้านล่างจาก Golo Roden หรือไม่?
Labithiotis

@ Dazzler13 ฉันเล่นกับมันเป็นเวลาหนึ่งชั่วโมงและไม่สามารถใช้งานได้ Express 4.0 แอพที่สร้างขึ้น, เราเตอร์ที่ทำ, แอปใช้งาน (เส้นทาง, เราเตอร์), เราเตอร์เส้นทางไม่ปรากฏในแอปพลิเคชัน _router ตัวอย่าง?
Michael Cole

ตัวอย่างจาก @Caleb ด้านล่างใช้งานได้ดีสำหรับเส้นทางที่จัดการกับสิ่งที่ต้องการ express.Router หากนั่นคือปัญหาของคุณ โปรดทราบว่าเส้นทางที่ตั้งค่าด้วยมิดเดิลแวร์ (รวมถึง express.Router) อาจไม่แสดงขึ้นมาทันทีและคุณอาจต้องเพิ่มความล่าช้าเล็กน้อยก่อนที่จะตรวจสอบเส้นทางในแอป __router (แม้ใช้วิธีการจาก @Caleb)
เลนคอลลินส์

8

เอาต์พุต 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));

มีลักษณะเช่นนี้:

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

เอาท์พุทสตริง

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());

มีลักษณะเช่นนี้:

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

สิ่งเหล่านี้ขึ้นอยู่กับคำตอบ ของ @ corvid

หวังว่านี่จะช่วยได้


5

ฉันได้รับแรงบันดาลใจจากรายการด่วนเส้นทางของ Labithiotis แต่ฉันต้องการภาพรวมของเส้นทางทั้งหมดและ URL ที่ดุร้ายในคราวเดียวโดยไม่ระบุเราเตอร์และคิดคำนำหน้าในแต่ละครั้ง สิ่งที่ฉันคิดขึ้นมาก็คือแทนที่ฟังก์ชั่น app.use ด้วยฟังก์ชั่นของตัวเองซึ่งเก็บ baseUrl และเราเตอร์ที่ได้รับ จากตรงนั้นฉันสามารถพิมพ์ตารางของเส้นทางทั้งหมดของฉันได้

หมายเหตุสิ่งนี้ใช้ได้กับฉันเพราะฉันประกาศเส้นทางของฉันในไฟล์เส้นทางเฉพาะ (ฟังก์ชั่น) ซึ่งได้รับการส่งผ่านในวัตถุแอพเช่นนี้:

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

สิ่งนี้ทำให้ฉันสามารถผ่านวัตถุ 'แอป' อีกอันด้วยฟังก์ชั่นการใช้งานปลอมและฉันสามารถรับเส้นทางทั้งหมดได้ สิ่งนี้ใช้ได้กับฉัน (ลบข้อผิดพลาดบางส่วนที่ตรวจสอบเพื่อความชัดเจน แต่ยังใช้งานได้กับตัวอย่าง):

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

ตัวอย่างเต็มรูปแบบนี้ (ที่มีเราเตอร์ CRUD พื้นฐาน) ได้รับการทดสอบและพิมพ์ออกมา:

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

ใช้cli-tableฉันได้รับสิ่งนี้:

┌────────┬───────────────────────┐
         => 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 
└────────┴───────────────────────────────────┘

ซึ่งเตะตูด


4

ด่วน 4

รับการกำหนดค่าExpress 4พร้อมจุดสิ้นสุดและเราเตอร์ที่ซ้อนกัน

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

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

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

app.use(router)

การขยายคำตอบ@calebเป็นไปได้ที่จะรับเส้นทางทั้งหมดซ้ำและเรียงลำดับ

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
}

สำหรับการส่งออกสตริงพื้นฐาน

infoAboutRoutes(app)

เอาต์พุตคอนโซล

/**
* 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
}

อัปเดต 1:

เนื่องจากข้อ จำกัด ภายในของ Express 4 จึงไม่สามารถเรียกแอปที่เมาท์และเราเตอร์ที่เมาท์ได้ ตัวอย่างเช่นไม่สามารถรับเส้นทางจากการกำหนดค่านี้

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

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

รายการเส้นทางที่เมานต์ทำงานได้กับแพ็คเกจนี้: github.com/AlbertoFdzM/express-list-endpoints
jsaddwater

4

ต้องการการปรับแต่งบางอย่าง แต่ควรใช้กับ Express v4 .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", "..."]

แก้ไข: การปรับปรุงรหัส


3

วิธีการที่ได้รับการปรับปรุงเล็กน้อยและใช้งานได้ดีขึ้นสำหรับคำตอบของ @ 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

สิ่งนี้ใช้ได้สำหรับฉัน

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

เริ่มต้นเราเตอร์ด่วน

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!',
      });
   });   

นำเข้าตัวควบคุมผู้ใช้

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

เส้นทางผู้ใช้

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

ส่งออกเส้นทาง API

module.exports = router;

เอาท์พุต

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

1

ใน Express 3.5.x ฉันเพิ่มสิ่งนี้ก่อนเริ่มแอพเพื่อพิมพ์เส้นทางบนเทอร์มินัลของฉัน:

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

อาจช่วยได้ ...


1

คุณสามารถใช้/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);
});

นี่คือตัวอย่าง: https://glitch.com/edit/#!/get-all-routes-in-nodejs


Obs: สิ่งนี้ใช้ไม่ได้กับ express 'Router ()
Gustavo Morais

0

ดังนั้นฉันจึงดูคำตอบทั้งหมด .. ไม่ชอบมากที่สุด .. ใช้เวลาสักครู่ .. ทำสิ่งนี้:

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

ไม่ใช่คนที่สวยที่สุด .. แต่ซ้อนกันและทำอุบาย

ยังทราบว่า 20 ที่นั่น ... ฉันแค่คิดว่าจะไม่มีเส้นทางปกติที่มี 20 วิธี .. ดังนั้นฉันจึงสรุปได้ว่ามันคือทั้งหมด ..


0

รายละเอียดเส้นทางคือการแสดงเส้นทางสำหรับ "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));
});

ผลลัพธ์ที่เรียบง่ายของรหัส

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

เพียงแค่ใช้แพคเกจ npm นี้มันจะให้เว็บเอาท์พุทเช่นเดียวกับขั้วเอาท์พุทในมุมมองตารางที่จัดรูปแบบที่ดี

ป้อนคำอธิบายรูปภาพที่นี่

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


2
แพ็คเกจอื่นนี้ได้รับการยอมรับมากขึ้น npmjs.com/package/express-list-endpoints ฉันเป็น 21.111 เทียบกับ 34 การดาวน์โหลดรายสัปดาห์ อย่างไรก็ตามexpress-routes-catalogueยังแสดงเส้นทางเป็น HTML และอีกเส้นทางหนึ่งไม่แสดง
อาจ

1
ไม่เลวเอกสารประกอบของแพคเกจแตกต่างจากชื่อแพคเกจจริงเมื่อต้องการและแพคเกจนี้เหมือนคนอื่น ๆ ที่กล่าวถึงเพียงแสดงเส้นทางชั้นเดียวที่มันรวมอยู่
hamza khan

@hamzakhan ps ขอบคุณสำหรับการอัปเดตฉันเป็นผู้เขียนเร็ว ๆ นี้จะได้รับการอัปเดตในเอกสารประกอบ
วีเจย์

-1

นี่คือฟังก์ชั่นหนึ่งบรรทัดเพื่อพิมพ์เส้นทางใน 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();

-1

โดยด่วน 4 *

//Obtiene las rutas declaradas de la API
    let listPathRoutes: any[] = [];
    let rutasRouter = _.filter(application._router.stack, rutaTmp => rutaTmp.name === 'router');
    rutasRouter.forEach((pathRoute: any) => {
        let pathPrincipal = pathRoute.regexp.toString();
        pathPrincipal = pathPrincipal.replace('/^\\','');
        pathPrincipal = pathPrincipal.replace('?(?=\\/|$)/i','');
        pathPrincipal = pathPrincipal.replace(/\\\//g,'/');
        let routesTemp = _.filter(pathRoute.handle.stack, rutasTmp => rutasTmp.route !== undefined);
        routesTemp.forEach((route: any) => {
            let pathRuta = `${pathPrincipal.replace(/\/\//g,'')}${route.route.path}`;
            let ruta = {
                path: pathRuta.replace('//','/'),
                methods: route.route.methods
            }
            listPathRoutes.push(ruta);
        });
    });console.log(listPathRoutes)

-2

ฉันเผยแพร่แพคเกจที่พิมพ์มิดเดิลแวร์และเส้นทางทั้งหมดมีประโยชน์จริง ๆ เมื่อพยายามตรวจสอบแอปพลิเคชันแบบด่วน คุณเมานท์แพคเกจเป็นมิดเดิลแวร์ดังนั้นมันยังพิมพ์ออกมาเอง:

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

มันพิมพ์ต้นไม้ชนิดหนึ่งเช่น:

- middleware 1
- middleware 2
- Route /thing/
- - middleware 3
- - controller (HTTP VERB)  
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.