【问题标题】:Maintaining es6 class state over requests with express router使用快速路由器在请求上维护 es6 类状态
【发布时间】:2017-12-20 10:40:51
【问题描述】:

我最近尝试使用 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 时,this 对象在 create 函数中未定义。

通过一点调试,我知道在注册路由时调用了构造函数。

taskController 在实际调用 create 函数时会丢失上下文。

我怎样才能使它与这种结构一起工作,或者我必须恢复到 module.exporting 每个功能任务控制器?

【问题讨论】:

    标签: node.js class ecmascript-6


    【解决方案1】:

    您可以使用绑定方法来绑定上下文。同时传递创建函数。

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

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

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

    【讨论】:

    • 好的,这行得通,但是你能解释一下它是如何失去上下文的吗?我知道 bind 的工作原理,但我不明白 taskController 是如何在这里失去上下文的。路由在每个应用程序运行时只注册一次,并且在注册时 taskController 是好的。
    • 您只是将 taskController.create 的引用传递给 isAuthorized 方法,该方法将在其上下文中执行回调,因此这将引用 isAuthorized 的上下文而不是 taskController
    猜你喜欢
    • 2016-02-17
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2018-04-05
    • 2016-09-18
    • 2020-03-27
    相关资源
    最近更新 更多