首页 > 解决方案 > 从闭包访问实例变量

问题描述

我有一个我正在处理的 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

除了强制所有控制器方法接受它们的依赖项之外,有没有办法解决这个问题?如果是这种情况,我必须将存储库、请求、服务等传递给控制器​​方法。从通用路由器的角度来看,这将是一组不同的问题。

标签: javascriptnode.jsclosures

解决方案


推荐阅读