Доступ к переменным экземпляра из замыкания - PullRequest
1 голос
/ 25 апреля 2019

У меня есть серверный проект 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 не определен.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...