如何使用功能,类和req.pipe对快速应用进行模块化?

时间:2018-11-09 22:13:51

标签: javascript node.js express

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

面临的挑战是通过一些通过其他方法公开的应用程序共享的一些其他预定义代码模式来扩展表达。

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

1 个答案:

答案 0 :(得分:2)

在所有这些示例中,我都不认为您会遇到性能问题,因此问题仍然存在于其中。

如果您愿意使用其中的一个npm软件包,则不应在服务器代码中调用express()。相反,您应该将app作为参数传递。这将允许您重复使用在其他地方初始化的现有Express应用。因此,我会选择gqlServer_02

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