এক্সপ্রেসে সমস্ত নিবন্ধিত রুটগুলি কীভাবে পাবেন?


181

আমি নোড.জেএস এবং এক্সপ্রেস ব্যবহার করে একটি ওয়েব অ্যাপ্লিকেশন তৈরি করেছি। এখন আমি নিবন্ধিত সমস্ত রুটগুলিকে তাদের যথাযথ পদ্ধতিতে তালিকাবদ্ধ করতে চাই।

উদাহরণস্বরূপ, যদি আমি মৃত্যুদণ্ড কার্যকর করেছি

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

আমি কোনও অবজেক্ট (বা এর সমতুল্য কিছু) পুনরুদ্ধার করতে চাই যেমন:

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

এটি কি সম্ভব, এবং যদি তা হয় তবে কীভাবে?


আপডেট: এদিকে, আমি একটি এনপিএম প্যাকেজ তৈরি করেছি যা গেট -রুটগুলি প্রদত্ত অ্যাপ্লিকেশন থেকে রুটগুলি বের করে, যা এই সমস্যার সমাধান করে। বর্তমানে, কেবল এক্সপ্রেস 4.x সমর্থিত তবে আমার ধারণা এখনকার জন্য এটি ঠিক আছে। শুধু এফওয়াইআই।


আমি যে সকল সমাধানের চেষ্টা করেছি তার সবগুলিই যখন আপনি রাউটারগুলি সংজ্ঞায়িত করেন তখন কাজ করবেন না। এটি কেবল রুট প্রতি কাজ করে - যা আমার অ্যাপ্লিকেশনটিতে সেই রুটের পুরো url দেয় না ...
লোক মোগ্রাবি

1
@guymograbi আপনি তাকান করতে চাইবেন stackoverflow.com/a/55589657/6693775
nbsamar

উত্তর:


229

এক্সপ্রেস 3.x

ঠিক আছে, এটি নিজেই খুঁজে পেয়েছি ... এটি কেবল app.routes:-)

এক্সপ্রেস 4.x

অ্যাপ্লিকেশন - দিয়ে নির্মিতexpress()

app._router.stack

রাউটার - দিয়ে নির্মিতexpress.Router()

router.stack

দ্রষ্টব্য : স্ট্যাকটিতে মিডলওয়্যার ফাংশনগুলিও অন্তর্ভুক্ত রয়েছে, এটি কেবল "রুটগুলি" পেতে ফিল্টার করা উচিত ।


আমি নোড ০.১০ ব্যবহার করছি এবং এটি ছিল app.routes.routes- যার অর্থ আমি JSON.stringify (app.routes.routes) করতে পারতাম
লোক মোগরাবি

7
কেবল 4.x নয়, এক্সপ্রেস 3.x এর জন্য কাজ করে 4.x এ, আপনার চেক করা উচিতapp._router.stack
avetisk

14
এটি আমার প্রত্যাশার মতো কাজ করে নি। app._router অ্যাপ্লিকেশন থেকে রুটগুলি অন্তর্ভুক্ত বলে মনে হচ্ছে না ('/ পথ', অন্যান্য রাউটার);
মাইকেল কোল

এমন কোনও উপায় আছে যা কমান্ড-লাইন স্ক্রিপ্টের সাথে একীভূত হতে পারে যা সরাসরি ওয়েব অ্যাপ শুরু না করে লাইভ অ্যাপ্লিকেশনটি করে ঠিক একই রুট ফাইলগুলিতে টানতে পারে?
লরেন্স আই সিডেন

4
কমপক্ষে 4.13.1 প্রকাশে অপরিজ্ঞাত app._router.stack
লেভিগ্রোকার 16

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

1
মনে রাখবেন যে আপনি যদি এক্সপ্রেস রাউটার (বা অন্য মিডলওয়্যার) এর মতো কিছু ব্যবহার করে থাকেন তবে আপনার @ কালেবকে কিছুটা দীর্ঘ উত্তর দেখতে হবে যা এই পদ্ধতির প্রসারিত হয়।
আইয়েন কলিন্স

30

এটি সরাসরি অ্যাপে (app.VERB এর মাধ্যমে) নিবন্ধিত রুটগুলি এবং রাউটার মিডলওয়্যার হিসাবে চিহ্নিত (রুট অ্যাপ্লিকেশন ব্যবহার করে) পায় gets এক্সপ্রেস 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
দুর্দান্ত, একটি উদাহরণের জন্য ধন্যবাদ যা দেখায় যে কীভাবে এক্সপ্রেস রাউটারের মতো মিডলওয়্যারের মাধ্যমে প্রদর্শনের রুট সেট করা যায়।
আয়েন কলিন্স

30

আমি একটি পুরানো পোস্ট মানিয়েছি যা আমার প্রয়োজনের জন্য আর অনলাইনে নেই online আমি এক্সপ্রেস ব্যবহার করেছি ou রাউটার () এবং এইভাবে আমার রুটগুলি নিবন্ধিত করেছি:

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

আমি 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;
};

তারপরে আমি এটিকে আমার সার্ভারে কল করি j

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

ফলাফলটি এরকম দেখাচ্ছে:

ফলাফল উদাহরণ

এটি কেবল একটি উদাহরণ তবে ব্যবহার হতে পারে .. আমি আশা করি ..


2
এই এখানে চিহ্নিত নেস্টেড রুটের জন্য কাজ করে না stackoverflow.com/questions/25260818/...

2
এই উত্তরে লিঙ্কটি সম্পর্কে সাবধান! এটি আমাকে এলোমেলো ওয়েবসাইটে পুনঃনির্দেশ করেছে এবং আমার কম্পিউটারে একটি ডাউনলোডকে বাধ্য করেছে।
টাইলার বেল

29

এক্সপ্রেস 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

কনসোল.লগ (সার্ভার.আরউটার.স্ট্যাক.ম্যাপ (r => r.route)। ফিল্টার (আর => আর)। ম্যাপ (আর => ${Object.keys(r.methods).join(', ')} ${r.path}))
স্ট্যান্ডআপ 75

আপনি এটিকে কোথায় রাখছেন?
জুয়ান

21

DEBUG=express:* node index.js

যদি আপনি উপরের কমান্ডটি দিয়ে আপনার অ্যাপ্লিকেশন চালনা করেন তবে এটি আপনার অ্যাপ্লিকেশনটি DEBUGমডিউল সহ চালু করবে এবং রুটগুলি দেবে, পাশাপাশি ব্যবহৃত সমস্ত মিডলওয়্যার ফাংশন।

আপনি উল্লেখ করতে পারেন: এক্সপ্রেসজেএস - ডিবাগিং এবং ডিবাগ


3
এখন পর্যন্ত সেরা উত্তর ... এক env ভার!
জিফ

আসলে, সবচেয়ে দরকারী উত্তর। @nbsamar আপনি এমনকি DEBUG=express:pathsকেবলমাত্র পথ আউটপুট দেখার জন্য এবং অন্য সমস্ত ডিবাগ বার্তাগুলি দেখার জন্য এটি ব্যবহার করতে বাড়াতে পারেন । ধন্যবাদ!
মার্ক এডিংটন

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

উত্পাদন

স্ক্রিন গ্র্যাব


কেন রুটগুলি আলাদা নয়?
ভ্লাদিমির ভুকানাক

1
এক্সপ্রেস 4.15 নিয়ে এটিই আমার পক্ষে কাজ করেছে। অন্য কেউই পুরো পথ দেয়নি। কেবলমাত্র সতর্কতাই হ'ল এটি ডিফল্ট মূল পাথটি ফেরত দেয় না / - তাদের কেউই তা করে না।
শেন

বুঝতে পারছি না কেন আপনি যুক্তি বাঁধেন print?
ZzZombo

@ জেডজমোম্বো ডগ উইলসনকে জিজ্ঞাসা করুন, তিনি এটি লিখেছিলেন। আপনি চাইলে আপনি সম্ভবত এটি পরিষ্কার করতে পারেন।
AlienWebguy

11

https://www.npmjs.com/package/express-list-endpPoint বেশ ভাল কাজ করে।

উদাহরণ

ব্যবহার:

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); ...
ড্যানোসোয়ার

8

এক্সপ্রেস 4 এ সমস্ত রুটে লগ করার জন্য একটি ক্রিয়াকলাপ (সহজেই ভি 3 ~ এর জন্য টুইট করা যেতে পারে)

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

এটি একটি এনপিএম https://www.npmjs.com/package/express-list-routes এ তৈরি করেছেন


1
এটি আমার প্রত্যাশার মতো কাজ করে নি। app._router অ্যাপ্লিকেশন থেকে রুটগুলি অন্তর্ভুক্ত বলে মনে হচ্ছে না ('/ পথ', অন্যান্য রাউটার);
মাইকেল কোল

@ মিশেলকোল আপনি কি নীচে উত্তরটি গোলো রোডেন থেকে দেখেছেন?
Labithiotis

@ Dazzler13 আমি এটি নিয়ে এক ঘন্টার জন্য খেলেছি, এবং এটি কাজ করতে সক্ষম হইনি। এক্সপ্রেস ৪.০ তৈরি অ্যাপ্লিকেশন, তৈরি রাউটার, অ্যাপ.উজ (পাথ, রাউটার), রাউটার রুটগুলি অ্যাপ্লিকেশনটিতে উপস্থিত হয়নি __আউটার। উদাহরণ?
মাইকেল কোল

নীচে @ ক্যালাবের উদাহরণটি এক্সপ্রেসের মতো কিছু সহ পরিচালিত রুটের পক্ষে ভাল কাজ করে that's এটি যদি আপনার সমস্যা হয় তবে রউটার। নোট করুন যে মিডলওয়্যারের সাথে সেট করা রুটগুলি (এক্সপ্রেস.রোউটার সহ) এখনই দেখাতে পারে না এবং অ্যাপ্লিকেশনগুলিতে তাদের পরীক্ষা করার আগে আপনাকে অল্প বিলম্বের সাথে যুক্ত করতে হবে (এমনকি @ ক্যালাবের কাছ থেকে পন্থা ব্যবহার করা)।
আইয়েন কলিন্স

8

জেসন আউটপুট

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

এগুলি @ করভিডের উত্তরের ভিত্তিতে রয়েছে

আশাকরি এটা সাহায্য করবে


5

আমি ল্যাবিথিয়টিসের এক্সপ্রেস-তালিকা-রুটগুলি দ্বারা অনুপ্রাণিত হয়েছি, তবে আমি আমার সমস্ত রুট এবং ব্রুট ইউআরএলগুলির একই সাথে একটি সংক্ষিপ্ত বিবরণ চেয়েছিলাম, এবং কোনও রাউটার নির্দিষ্ট না করে প্রতিবার উপসর্গটি বের করেছিলাম। আমি যে কিছুটা সামনে এলাম তা হ'ল আমার নিজের ফাংশন দিয়ে অ্যাপ.ইউজ ফাংশনটি প্রতিস্থাপন করা যা বেসউরল এবং প্রদত্ত রাউটার সঞ্চয় করে। সেখান থেকে আমি আমার সমস্ত রুটের যে কোনও টেবিল মুদ্রণ করতে পারি।

এটি আমার পক্ষে কাজ করুন কারণ আমি আমার রুটগুলি একটি নির্দিষ্ট রুট ফাইলে (ফাংশন) এ ঘোষণা করি যা অ্যাপ্লিকেশনটিতে পাস হয়ে যায়:

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

এই পুরো উদাহরণটি (কিছু বেসিক সিআরইউডি রাউটার সহ) সবেমাত্র পরীক্ষা করে মুদ্রিত হয়েছিল:

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

ক্লাই-টেবিল ব্যবহার করে আমি এরকম কিছু পেয়েছি:

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

এন্ডপয়েন্টস এবং নেস্টেড রাউটারগুলির সাথে একটি এক্সপ্রেস 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)

@ কালেব উত্তরটি প্রসারিত করে সমস্ত রুটগুলি পুনরাবৃত্তভাবে এবং বাছাই করা সম্ভব।

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:

এক্সপ্রেস 4 এর অভ্যন্তরীণ সীমাবদ্ধতার কারণে মাউন্ট করা অ্যাপ এবং মাউন্ট করা রাউটারগুলি পুনরুদ্ধার করা সম্ভব নয়। উদাহরণস্বরূপ, এই কনফিগারেশন থেকে রুটগুলি পাওয়া সম্ভব নয়।

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

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


4

কিছু সামঞ্জস্য প্রয়োজন তবে এক্সপ্রেস ভি 4 এর জন্য কাজ করা উচিত। যুক্ত হওয়া রুটগুলি সহ .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

@ প্রনয়ের উত্তরের জন্য সামান্য আপডেট হওয়া এবং আরও কার্যকরী পদ্ধতির:

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 / পি:

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

এপিআই রুট রফতানি করুন

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

এক্সপ্রেস 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']);
      });
    }
}

হতে পারে এটি সাহায্য করতে পারে ...


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 টি পদ্ধতির সাথে কোনও সাধারণ রুট হবে না .. তাই আমি অনুমিত করি এটি সমস্ত ..


0

রুটের বিশদগুলি "এক্সপ্রেস": "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

কেবল এই এনপিএম প্যাকেজটি ব্যবহার করুন, এটি ওয়েব-আউটপুট পাশাপাশি টার্মিনাল আউটপুটকে সুন্দর ফর্ম্যাট করা টেবিল দৃশ্যে দেবে।

এখানে চিত্র বর্ণনা লিখুন

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


2
এই অন্যান্য প্যাকেজের আরও স্বীকৃতি রয়েছে। npmjs.com/package/express-list-endpPoint । 34 টি সাপ্তাহিক ডাউনলোডের বিপরীতে 21.111। তবে, express-routes-catalogueএইচটিএমএল হিসাবে রুটগুলিও প্রদর্শন করে, অন্যটির মতো করে না।
মায়িড

1
খারাপ নয়, প্যাকেজটির ডকুমেন্টেশনগুলি প্রয়োজন অনুসারে প্রকৃত প্যাকেজের নাম থেকে পৃথক হয় এবং অন্য সমস্ত উল্লিখিত প্যাকেজের মতো এটি কেবলমাত্র একক স্তরের রাস্তা দেখায় যেখানে এটি অন্তর্ভুক্ত রয়েছে
হামজা খান

@ হামজখান পিএস আপডেটের জন্য ধন্যবাদ। আমি লেখক, শীঘ্রই ডকুমেন্টেশনে আপডেট করা হবে।
বিজয়

0

আপনি একটি /get-all-routesএপিআই বাস্তবায়ন করতে পারেন :

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


-1

একটি এক্সপ্রেসে রুটগুলি সুন্দরভাবে মুদ্রণের জন্য এখানে একটি লাইন ফাংশন রয়েছে 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

আমি একটি প্যাকেজ প্রকাশ করেছি যা সমস্ত মিডলওয়্যারের পাশাপাশি রুটগুলি মুদ্রণ করে, এক্সপ্রেস অ্যাপ্লিকেশনটি অডিট করার চেষ্টা করার সময় সত্যিই দরকারী। আপনি প্যাকেজটি মিডলওয়্যার হিসাবে মাউন্ট করেছেন, তাই এটি নিজের মুদ্রণ এমনকি:

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.