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