#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
не определен.
Есть ли способ обойти это, кроме как заставлять все методы контроллера принимать их зависимости? Мне пришлось бы передать репозиторий, запрос, службы и т.д. В метод контроллера, если это так. Это был бы другой набор проблем с точки зрения универсального маршрутизатора.