我最近尝试使用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);
};
问题是在点击create api时,在create function中未定义此对象。
通过一些调试,我知道在注册路由时会调用构造函数。
但是当实际调用create函数时,任务Controller会丢失上下文。
如何使其与此结构一起使用或者我是否必须恢复到module.exporting每个功能任务控制器?
您可以使用bind方法绑定上下文。通过创建功能。
router.post('', middlewares.isAuthorized('task:create'), taskController.create.bind(taskController));
create方法正在丢失上下文,因为它是通过post方法在不同的范围内调用的。
您可以使用bind方法绑定上下文,该方法返回一个函数并将该函数传递给create方法。