如何列出Express挂载应用的所有REST端点?

时间:2016-09-02 17:53:10

标签: javascript node.js rest express

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

使用Advance 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);
  }

有关详细信息,请查看my source

问题

  1. 如果您查看我的来源,我有几个已安装的应用程序,而待办事项只是其中之一。为什么其他模块/已挂载的应用程序未在上面的路由对象中列出?为什么路由中存在<anonymous>和空的mounted_app对象。是否存在安全漏洞或其他任何问题?

  2. 如何列出核心的RESTful端点,todos应用程序和其他的mounted_apps(最好自动)?如何调整我的应用程序设计/架构以方便列表?我想拥有所有路由的对象,因此能够列出主应用程序导航栏的核心路由和子导航栏的已安装应用程序路径。

  3. 非常感谢。

    编辑:不重复,我在app._router.stack看到有关Express 4路线的帖子,并继续我的测试。阅读我的第一行。

2 个答案:

答案 0 :(得分:0)

您可以使用提供的代码here

访问快递应用中的所有已注册路线

答案 1 :(得分:0)

以下是我的第二个问题。第一个问题仍在等待您的帮助。

我创建了一个名为moduls的额外数组,基本上modul是一个迭代模块名,我可以分配moduls[modul] = express() app实例。

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

然后,您可以拨打&#39; apps&#39;随时随地。在我的git repo中,我选择在路由中加载它以查看发送到API客户端的响应。

如果可以,请在问题1中帮助解决我的问题。