从闭包访问实例变量

时间:2019-04-25 03:17:16

标签: javascript node.js closures

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

除了强制所有控制器方法接受其依赖关系之外,还有其他方法可以解决此问题吗?如果是这种情况,我必须将存储库,请求,服务等传递给控制器​​方法。从通用路由器的角度来看,那将是另一组问题。

0 个答案:

没有答案