Кароче вопрос простой без балды.
Вот кусок кода стыриный с кейса в expressjs и их доки.
Суть, что перед запуском сервера, проходит по обработчикам и вставляет передними трамплин.
const express = require('express')
const app = express()
app.get('/path/:id', function(req, res, next) {
res.send(`${this.method} ${this.path}`)
})
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('/'))
//
// Аттачим хэндлеру this :D
//
const m = layer.method.toUpperCase()
const p = path.concat(split(layer.regexp)).filter(Boolean).join('/')
const fn = layer.handle
layer.handle = function trampoline() {
const self = {
method: m,
path: p
}
fn.apply(self, arguments)
}
}
}
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, []))
app.listen(3000, () => console.log('Example app listening on port 3000!'))