我正在尝试创建一种方法,使我可以非常轻松地注册路由,而不必实际执行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是否有一种方法,我可以在拥有应用程序实例的情况下从应用程序访问它。如前所述,从函数行的末尾删除()
只是引用该函数,而不调用它。
任何帮助将不胜感激。
答案 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
,以便您不使用保留关键字。它可以工作,但可能会导致您遇到问题,并且最好不要使用这些问题。