如何列出快速安装的应用程序的所有REST端点

How to list all REST end-points for Express mounted Apps?

本文关键字:REST 端点 应用程序 安装 何列出      更新时间:2023-09-26

在Express 4中,有一个对象来列出你的应用程序路由:app._router.stack

我尝试在todos模块路由文件中的路由中将其转储到控制台:

exports.update = (req,res) => {
  // console.log(app._router.stack);
  res.status(200).send({message:'TODO modify an existing post by using param ' + req.params.taskId, routes: app._router.stack});
};

在高级REST客户端测试。我看到了我的routes对象:

"routes": [21]    
9:  {
"name": "session"
"params": {}
"path": ""
"keys": [0]
"regexp": {
"fast_slash": true
}-
}-
10:  {
"name": "<anonymous>"
"params": {}
"path": ""
"keys": [0]
"regexp": {
"fast_slash": true
}-
}-
11:  {
"name": "mounted_app"
"keys": [0]
"regexp": {}
}-
12:  {
"name": "bound dispatch"
"keys": [0]
"regexp": {}
"route": {
"path": "/home"
"stack": [1]
0:  {
"name": "<anonymous>"
"keys": [0]
"regexp": {}
"method": "get"
}-
-
"methods": {
"get": true
}-
}-
}-
13:  {
"name": "bound dispatch"
"keys": [0]
"regexp": {}
"route": {
"path": "/"
"stack": [1]
0:  {
"name": "<anonymous>"
"keys": [0]
"regexp": {}
"method": "get"
}-
-
"methods": {
"get": true
}-
}-
}-
14:  {
"name": "mounted_app"
"keys": [0]
"regexp": {}
}-
15:  {
"name": "mounted_app"
"params": {}
"path": "/todos"
"keys": [0]
"regexp": {}
}-
16:  {
"name": "mounted_app"
"keys": [0]
"regexp": {}
}-
17:  {
"name": "serveStatic"
"keys": [0]
"regexp": {
"fast_slash": true
}-
}

在我的Express应用程序中,我的挂载应用程序是这样定义的:

  if (module.re('core')){
    register(app);
  } else {
    var sub = express();
    register(sub);
    app.use('/' + module, sub);
  }

    function register(app){
    app.set('root', root);
    app.set('module_name', module);
    require(routes)(app);
    app.set('views', view_path);
    app.set('view engine', view_engine);
  }

更多细节,请查看我的源代码

:

  1. 如果你查看我的源代码,我有几个挂载的应用程序和todos只是其中之一。为什么其他模块/挂载的应用没有在上面的路由对象中列出?为什么路由中有<anonymous>和空的mounted_app对象?是否存在安全漏洞或其他问题?

  2. 如何列出核心,todos应用程序和其他mounted_apps的RESTful端点(最好自动) ?如何调整我的应用程序设计/架构,以促进上市?我想要一个包含所有路由的对象,以便能够列出主应用导航栏的核心路由和子导航栏的挂载应用路由。

非常感谢。

EDIT:不重复,我看到了关于app._router.stack快速4路线的帖子,然后继续进行我的测试。读我的第一行

你可以使用这里提供的代码访问快递应用中所有已注册的路由

下面回答我的第二个问题。第一个问题还在等待您的帮助。

我创建了一个名为modules的额外数组,基本上模块是一个迭代模块名称,我能够分配moduls[modul] = express()应用程序实例。

+    moduls[modul] = express();
 +    var sub = moduls[modul];
      register(sub);

换句话说,一个挂载的应用程序被注册到moduls数组中,之后我可以用_来循环它。forOwn并将app._router.stack对象赋值给一个新的数组apps.

+  _.forOwn(moduls, function(val,key){
 +     apps[key] = val._router.stack;
 +  });
 +
 +  app.set('apps', apps);

然后,你可以在任何你喜欢的地方调用'apps'。在我的git仓库中,我选择在路由中加载它,以查看发送给API客户端的响应。

如果可以,请帮我解决问题1