Я хочу создать промежуточное ПО для постобработки,
до сих пор я написал свое предварительное ПО.
Это мой ParentClass для каждого контроллера, который я наследую.
"use strict";
class Router {
protected app;
protected routePath;
protected _routes;
// Constructor takes:
// - routePath which is the base path for each service exposed by the router subclass (ie. '/auth/users')
// - app which is the Express application ref
constructor(routePath,app) {
if (app == null) throw new Error("Missing required App");
this.app = app;
this.routePath = routePath;
this._routes = [];
this.registerServices();
}
// Computed services property is the only property you must overwrite in your
// Router subclass. Base implementation does nothing but here you should
// return a dictionary where:
// - the key is the HTTP_METHOD + PATH of the service (ie. 'POST login/fb/:token')
// the path is the same you should set with a classic route register with express.
// - the value is the name of the function you should call (you must implement it in your subclass).
get services() { return {}; }
private preMiddlewares() { return []; }
private postMiddlewares() { return []; }
// registerRoutes function simply iterate over services property getting the verb, the path
// and the function and register it along with the base path of the route.
registerServices() {
if ( this.preMiddlewares().length) {
const middlewares = this.preMiddlewares();
for (let i = 0; i < middlewares.length; i ++) {
this.app.use(this.routePath, middlewares[i]);
}
}
const router_services = this.services;
const _this = this;
Object.keys(router_services).forEach( full_path => {
// This is the name of the JS function which implement the service's logic
const service_function = router_services[full_path];
const path_items = full_path.split(' ');
const verb = (path_items.length > 1 ? path_items[0] : 'get').toLowerCase();
const path = this.routePath + (path_items.length > 1 ? path_items[1] : full_path);
this.app[verb](path, this[service_function].bind(this));
});
}
protected build (message , success = 0, more = {}) {
let response = { message, success };
for ( const key in more )
if (more.hasOwnProperty(key))
response[key] = more[key];
return response;
}
}
module.exports = Router;
В этом у меня есть две функции PreMiddleware и PostMiddleware, которые предоставляют массив функций, которые я хочу обработать после промежуточного программного обеспечения.
Я попробовал это, как мой первый подход, и не работает
const_this = this;
this.app[verb](path, (req, res, next) => {
_this[service_function](req, res, next).bind(_this);
next();
})
Почему я хочу postMiddleware, а не предварительно:
У нас есть разработанное программное обеспечение, в котором хранятся данные о пациентах и все такое, как EMR / EHR.
Мы сделали программное обеспечение для Hospital Environment с прекрасным интернет-сервисом.
С новым требованием, он должен работать и в MedicalCamps без доступа к Интернету. Таким образом, у нас есть идея создать локальный сервер, хранить ответы и запросы в flatFile. поэтому мы можем загрузить его позже на сервер prod и импортировать.
Сохранение ответов важно, и есть много API, и я хочу использовать его в качестве модуля plug & play, поэтому, если бит в конфигурации равен true
, это промежуточное ПО будет применено.