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