Как модулировать экспресс-приложение - с помощью функции, класса и req.pipe? - PullRequest
0 голосов
/ 10 ноября 2018

Здесь внизу есть два servers и два gqlServers. Все их комбинации работают.

Задача состоит в том, чтобы расширить экспресс с помощью некоторых дополнительных предопределенных шаблонов кода, совместно используемых несколькими приложениями, с помощью дополнительных методов.

Какая комбинация server и gqlServer считается лучшей практикой и лучшей для производительности?

server:

  • server_A - это функция, которая возвращает класс
  • server_B - это функция, которая возвращает функцию

gqlServer:

  • gqlServer_01 использует req.pipe
  • gqlServer_02 имеет оригинальный express(), переданный в него
function gqlServer_01(options) {
    let gqlApp = express();
    gqlApp.use(options.route, function(req, res, next) {
        res.send('gqlServer 01');
        // next();
    });

    gqlApp.listen(8001, err => {
        if (err) throw err;
        console.log(`>> GQL Server running on 8001`);
    });
}
function gqlServer_02(app, options) {
    app.use(options.route, function(req, res, next) {
        res.send('gqlServer 02');
        // next();
    });
}
// THIS SERVER ?
function server_A(config = {}) {
    config = deepmerge(def_opt, config);
    let app = express();

    app.get('/', function(req, res, next) {
        res.send('root');
        // next();
    });

    class Server {
        constructor(opt) {
            this.opt = opt;
        }

        gql(props = {}) {
            // THIS GQL SERVER ?
            gqlServer_01({ route: '/gql-01' });
            app.use('/gql-01', function(req, res) {
                req.pipe(request(`http://localhost:8001/gql-01`)).pipe(res);
            });

            // OR THIS GQL SERVER ?
            gqlServer_02(app, { route: '/gql-02' });
        }
    }

    app.listen(8000, err => {
        if (err) throw err;
        console.log(`>> Server running on 8000`);
    });

    return new Server(app, config);
}
// OR THIS SERVER ?
function server_B(config = {}) {
    config = deepmerge(def_opt, config);
    let app = express();

    app.get('/', function(req, res, next) {
        res.send('root');
        // next();
    });

    app.gql = function(props = {}) {
        // THIS GQL SERVER ?
        gqlServer_01({ route: '/gql-01' });
        app.use('/gql-01', function(req, res) {
            req.pipe(request(`http://localhost:8001/gql-01`)).pipe(res);
        });

        // OR THIS GQL SERVER ?
        gqlServer_02(app, { route: '/gql-02' });
    };

    app.listen(8000, err => {
        if (err) throw err;
        console.log(`>> Server running on 8000`);
    });

    return app;
}

Цель состоит в том, чтобы найти лучшее решение для создания из этого пакета npm и легкого повторного использования методов в нескольких проектах. Проект был очень упрощен ради ясности.

1 Ответ

0 голосов
/ 10 ноября 2018

Я не думаю, что у вас будут проблемы с производительностью в любом из этих примеров, поэтому остается вопрос, какой из них является более модульным.

Если вы хотите сделать из них пакет npm, вам не следует звонить express() в коде вашего сервера. Вместо этого вы должны передать app в качестве параметра. Это позволит вам повторно использовать существующие экспресс-приложения, инициализированные в других местах. По этой причине я бы пошел на gqlServer_02

Вы также хотите создавать новый сервер каждый раз, когда вызываете функцию модуля, поэтому по этой причине я бы выбрал server_A. Однако он должен получить экспресс app в качестве параметра, чтобы повторно использовать существующие объекты экспресса. Я бы также поместил вызов app.listen внутри функции класса Server.

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