我正在做一个带有UserController类的js.js项目,其中包含getAllUsers和findUserById等方法。为了在User路由器中使用这些方法,我发现自己在创建UserController示例时绑定了每个方法,以确保正确的“this”上下文(refer to this Stack Overflow question)。
// UserRouter.js
const express = require('express');
const userController = require('./UserController');
const userRouter = express.Router();
userRouter.get('/users', userController.getAllUsers.bind(userController));
userRouter.get('/users/:id', userController.findUserById.bind(userController));
module.exports = userRouter;
字符串
是否有更高效、更主流的方法来处理Cock.js UserController中的上下文绑定问题?
另一种解决方案是绑定UserController构造函数中的所有方法。然而,这种方法感觉并不干净,因为每次添加新方法时都需要修改构造函数。
// UserController.js
class UserController {
constructor() {
this.getAllUsers = this.getAllUsers.bind(this);
this.findUserById = this.findUserById.bind(this);
// more method bindings as needed
}
// Methods implementation
}
module.exports = UserController;
型
2条答案
按热度按时间ebdffaop1#
使用箭头函数而不是方法:
字符串
您也可以将它们声明为类字段:
型
这是有some problems,但它们主要与继承有关,我怀疑你想子类化你的控制器(使用组合代替)。
或者,使用
function
代替class
:型
在这里,你可以通过闭包引用
dependencies
,而不是作为this
的属性(同样没有绑定)。bis0qfac2#
字符串
至于路由器处理程序,它会像这样
型
如果你使用的是 typescript ,你应该这样输入
型
所以它基本上是一个函数,它接受任何需要的东西,并返回一个返回promise的处理程序
返回的promise应该返回你的函数返回的任何东西,所以在我的例子中,我返回响应,或者在错误的情况下返回undefined,这就是为什么它是
Promise<Response | undefined>
类型的原因。