【问题标题】:How to list all REST end-points for Express mounted Apps?如何列出 Express 安装的应用程序的所有 REST 端点?
【发布时间】:2016-09-02 17:53:10
【问题描述】:

在 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. 如果您查看我的来源,我有几个已安装的应用程序,todos 只是其中之一。为什么上面的路由对象中没有列出其他模块/安装的应用程序?为什么路由中有&lt;anonymous&gt; 和空mounted_app 对象。是否存在安全漏洞或任何其他问题?

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

非常感谢。

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

【问题讨论】:

  • 查看我的第一行和我的编辑注释。
  • 您的标题实际上与 dup 的标题相同,因此您确实要求在那里进行 dup。如果这不是您真正要问的,那么将您的标题更改为更具描述性或更好地总结您最后列出的两个实际问题的其他内容。如果您已经尝试了 dup 中的所有内容,但他们没有回答您的问题,那么您需要对此进行解释并引用特定的 dup,以便人们知道哪些内容不能解决您的问题。
  • 不,是 mounted Apps 的,标题中存在字样。
  • “已安装的应用程序”是什么意思? Express 术语中没有这样的术语。有一个app 对象和路由器。不确定挂载的应用是什么。
  • From object tree, "name": "mounted_app",这是它们(子应用程序)在app._router.stack中定义和调用的内容

标签: javascript node.js rest express


【解决方案1】:

您可以使用提供的代码here 访问快递应用中的所有注册路线

【讨论】:

  • 我从那里得到了app._router.stack(你发布的链接),控制台结果(路由对象)是在转储它之后。
【解决方案2】:

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

我创建了一个名为 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);

然后,您可以在任何您喜欢的地方调用“应用程序”。在我的git repo 中,我选择将其加载到路由中以查看发送到 API 客户端的响应。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-07
    • 2016-10-13
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多