Доступ к переменным экземпляра из замыкания

#javascript #node.js #closures

#javascript #node.js #замыкания

Вопрос:

У меня есть бессерверный проект nodejs, над которым я работаю, и с его помощью я создал пользовательский маршрутизатор, чтобы упростить мои бессерверные обработчики.

 class RequestRouter {
  constructor(event) {
    this.routes = {};
    this.request = {
      httpMethod: event.httpMethod,
      pathParameters: event.pathParameters,
      requestedResource: event.resource,
      body: JSON.parse(event.body),
      queryString: event.queryStringParameters,
      route: event.path,
      requestHeaders: event.headers,
     }
  }

  get(resource, callback) {
    this.registerRoute('GET', resource, callback);
  }

  post(resource, callback) {
    this.registerRoute('POST', resource, callback);
  }

  registerRoute(verb, resource, controllerCallback) {
    this.routes[resource verb] = { method: verb, controller: controllerCallback };
  }

  async routeRequest() {
    var resource = this.request.requestedResource;
    var verb = this.request.httpMethod;

    var route = this.routes[resource verb];
    if (route == null) {
      return { statusCode: 404, body: JSON.stringify({ message: 'Resource not found.' }) };
    }

    return await route.controller();
  }
}

module.exports = {
    RequestRouter
}
  

Благодаря этому у меня может быть выделенный обработчик для каждого ресурса, без тонны кода «котельной плиты».

 var listController = require('./controllers/list_controller');
var common = require('./handler_common');

async function handler(event) {

  var router = new common.RequestRouter(event);
  var controller = new listController.ListController(router.request);

  // Map routes to Controller functions for this handler
  router.get('/lists', controller.getLists);

  // Route the request into the router.
  return router.routeRequest();
};

module.exports.handler = handler
  

Проблема, с которой я сталкиваюсь, заключается в том, что я передаю обратный вызов метода контроллера маршрутизатору, что приводит к тому, что область действия метода контроллера не ограничивается самим экземпляром контроллера. Мне нужно, чтобы getLists_byId() область действия метода была ограничена экземпляром контроллера, чтобы я мог получить доступ к объекту запроса, который был предоставлен контроллеру через его конструктор.

 class ListController {
  constructor(request) {
    this.request = request;
  }

  // GET: /lists resource route
  async getLists_byId() {
    var requestedListId = this.request.pathParameters.id;
  }
}

module.exports = { ListController };
  

Когда путь к коду попадает в getLists_byId() this.request не определен.

Есть ли способ обойти это, кроме как заставлять все методы контроллера принимать их зависимости? Мне пришлось бы передать репозиторий, запрос, службы и т.д. В метод контроллера, если это так. Это был бы другой набор проблем с точки зрения универсального маршрутизатора.