我最近尝试使用nodejs中的es6类更新我的项目代码结构。
这是控制器类的外观
class TaskController {
constructor(io, redisClient) {
this.socket = io;
this.redisClient = redisClient;
}
create(req, res) {
let taskDetails = req.body;
taskDetails.owner = req.user.id;
let errorFields = Validation.validate(taskDetails, [
{ name: 'title', type: 'text' }
]);
if (errorFields.length > 0) {
return ErrorHandler.handleError(res, errorFields);
}
...`
}
}
以下是我在路由文件中初始化类的方法
module.exports = (app, io, redisClient) => {
let taskController = new TaskController(io, redisClient);
router.post('', middlewares.isAuthorized('task:create'), taskController.create);
app.use('/api/tasks', middlewares.isAuthenticated(), router);
};
问题是在点击创建 api时,此对象在create function中未定义。
通过一些调试,我知道在注册路由时会调用构造函数。
但 taskController 在实际调用create函数时会丢失上下文。
如何使其与此结构一起使用或者我必须恢复 module.exporting每个函数任务控制器?
答案 0 :(得分:0)
您可以使用bind方法绑定上下文。在传递create function时。
router.post('', middlewares.isAuthorized('task:create'), taskController.create.bind(taskController));
create方法正在丢失上下文,因为它是通过post方法在不同的范围内调用的。
您可以使用绑定方法绑定上下文,该方法返回一个函数并将该函数传递给create方法。