javascript - 从闭包访问实例变量
问题描述
我有一个我正在处理的 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
。
除了强制所有控制器方法接受它们的依赖项之外,有没有办法解决这个问题?如果是这种情况,我必须将存储库、请求、服务等传递给控制器方法。从通用路由器的角度来看,这将是一组不同的问题。
解决方案
推荐阅读
- javascript - 为什么即使没有失去焦点,React onChange 也能工作?
- matlab - 在 matlab 中使用 fminunc 保存多个优化图
- python - 将值添加到 Python 中字典中的特定键
- javascript - 当另一个打开时折叠内容html css javascript
- wordpress - Woocommerce - 一次将多个产品添加到购物车
- ios - 远程通知 iOS 中的通知标识符
- asp.net-core - ASP.NET Core 3.1单击浏览器后退按钮时如何强制重新加载视图
- django-models - 如何通过 uuid4 在 django 中获得正确的 UUID 格式而不是连字符?
- azure-data-explorer - kusto 中不同的无序动态列
- ionic4 - Showing SyntaxError: Unexpected token U in JSON at position 0 在尝试构建时电容器项目中的问题