Я хочу реализовать структуру postMiddleware в приложении Express.js - PullRequest
0 голосов
/ 12 января 2019

Я хочу создать промежуточное ПО для постобработки,

до сих пор я написал свое предварительное ПО. Это мой 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, это промежуточное ПО будет применено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...