如何模块化快递应用程序 - 功能,类和req.pipe?

问题描述 投票:0回答:1

下面有两个servers和两个gqlServers。它们的所有组合都有效。

面临的挑战是通过在多个应用程序之间共享的一些额外的预定义代码模式来扩展express,并通过其他方

servergqlServer的哪种组合被认为是最佳实践并且性能最佳?

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包,并轻松地在多个项目中重用这些方法。为清楚起见,该项目高度简化。

javascript node.js express
1个回答
2
投票

我不认为你会在任何这些例子中遇到性能问题,所以问题仍然是哪一个更模块化。

如果您愿意使用这些包中的npm包,则不应在服务器代码中调用express()。相反,你应该将app作为参数传递。这将允许您重用其他地方初始化的现有快速应用程序。出于这个原因,我会去gqlServer_02

您还希望每次调用模块函数时都创建一个新服务器,因此我会选择server_A。但是,它需要接收快速app作为参数,以便重用现有的快速对象。我还会把app.listen调用放在Server类的函数中。

© www.soinside.com 2019 - 2024. All rights reserved.