动态呼叫路由器功能

时间:2018-06-20 18:43:35

标签: javascript typescript express

我正在尝试创建一种方法,使我可以非常轻松地注册路由,而不必实际执行app.get('/', function (req, res, next) { });,它将通过我所传入的路由器对象自动为我完成此操作,如下所示...

{ 
    path: '',
    method: 'GET',
    function: 'test'
}

现在,一切正常,直到实际调用该函数为止。

问题在于我调用此函数的方式,因为它实际上并不调用仅引用它的函数。

这是调用它的代码。

this.routes.forEach((route: IRouter) => {
    const path = this.basePath + '/' + route.path;
    const requestMethod = route.method.toLowerCase();

    this.app[requestMethod](path, this[route.function]());
});

因此,您可以看到在this.app行的末尾,我正在调用该函数,但是实际上并没有传入任何必需的参数,例如res, req, next

Express是否有一种方法,我可以在拥有应用程序实例的情况下从应用程序访问它。如前所述,从函数行的末尾删除()只是引用该函数,而不调用它。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这应该工作,具体取决于this[route.function]()返回的内容。例如,如果test函数类似于:

test () {
    return (req, res, next) => {...}
}

那我不明白为什么它不起作用。如果是这样的话:

test (req, res, next) {...}

然后,您应该在添加路由处理程序时执行该功能。除非您将要传递给函数的东西,否则我将使用第二个测试函数而不执行它,因此您将:

class Foo () {
  constructor (config) {
    const { basePath } = this

    this.routes.forEach((route: IRouter) => {
      const path = `${basePath}/${route.path}`
      const requestMethod = route.method.toLowerCase()

     this.app[ requestMethod ](path, this[ route.function ].bind(this))
    })
  }

  test (req, res, next) {
    // ...
  }
}

这样您就不会创建不必要的功能。

我也将使用function而不是在路由对象中使用fn,以便您不使用保留关键字。它可以工作,但可能会导致您遇到问题,并且最好不要使用这些问题。