使用快速路由器维护es6类状态超过请求

时间:2017-12-20 10:40:51

标签: node.js class ecmascript-6

我最近尝试使用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每个函数任务控制器?

1 个答案:

答案 0 :(得分:0)

您可以使用bind方法绑定上下文。在传递create function时。

router.post('', middlewares.isAuthorized('task:create'), taskController.create.bind(taskController));

create方法正在丢失上下文,因为它是通过post方法在不同的范围内调用的。

您可以使用绑定方法绑定上下文,该方法返回一个函数并将该函数传递给create方法。