मैं लेबिथियोटिस की एक्सप्रेस-लिस्ट-मार्गों से प्रेरित था, लेकिन मैं अपने सभी मार्गों और एक ही बार में क्रूर url का अवलोकन चाहता था, और एक राउटर निर्दिष्ट नहीं करता था, और हर बार उपसर्ग का पता लगाता था। जो कुछ मैं लेकर आया था वह बस अपने स्वयं के फ़ंक्शन के साथ app.use फ़ंक्शन को बदलना था जो बेसयूआरएल और राउटर को संग्रहीत करता है। वहां से मैं अपने सभी मार्गों की किसी भी तालिका को प्रिंट कर सकता हूं।
नोट करें कि यह मेरे लिए काम करता है क्योंकि मैं अपने मार्गों को एक विशिष्ट मार्ग फ़ाइल (फ़ंक्शन) में घोषित करता हूं जो ऐप ऑब्जेक्ट में पास हो जाता है, जैसे:
// 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
क्ली-टेबल का उपयोग करके मुझे कुछ इस तरह मिला:
┌────────┬───────────────────────┐
│ │ => 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 │
└────────┴───────────────────────────────────┘
कौन सा किक गधा।