Функции класса теряют контекст, когда они передаются в экспресс-маршрутизатор - PullRequest
0 голосов
/ 18 декабря 2018

Недавно я написал небольшой модуль контроля доступа для приложения.Бэк-энд - это узел с экспрессом.Модуль выглядит следующим образом

class Rbac {
  constructor() {
    if (!Rbac.instance) {
      Rbac.instance = this;
    }
    this.rbacStructure = {};
    this.init = this.init.bind(this);
    this.checkPermission = this.checkPermission.bind(this);
    this.checkPermissionSync = this.checkPermissionSync.bind(this);
    this.checkPermissionMiddleware = this.checkPermissionMiddleware.bind(this);
    this.doesPermissionExistInGroup = this.doesPermissionExistInGroup.bind(
      this
    );
    this.instance = this;
    return Rbac.instance;
  }
  
  .
  .
  .
  .
  .
  .
  
const instance = new Rbac();

Object.freeze(instance);

export default instance;

В моем app.js я хочу передать экземпляр объекта маршрутизатору следующим образом

import Rbac from "./helpers/rbac";
import settingRouteExport from "./routes/settingRoutes";

const settingsRoutes = settingRouteExport(Rbac);
app.use("/settings", settingsRoutes);

И я пытаюсь использовать его в настройкахRoutes следующим образом

import express from "express";
const router = express.Router();
// Exporting the function that returns the router
export default (Rbac) => {
.
.
.
.
.
  router.get(
    "/users",
    Rbac.checkPermissionMiddleware(["canCreateUser", "canEditUser"]),
    UserControllers.getUsers
  ); 
.
.
.
.
.
  return router;
};

Несмотря на то, что я привязал функции класса к объекту, я получаю сообщение об ошибке ниже

TypeError: Cannot read property 'checkPermissionMiddleware' of undefined

Если я импортирую модуль непосредственно в маршрут, то всеработает как положено, я просто хочу знать, почему мои функции класса теряют контекст, даже если я связываю их в конструкторе.Есть ли способ предотвратить это?

...