如何用函数、类和req.pipe模块化express应用程序



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

我认为这些示例中的任何一个都不会出现性能问题,所以问题仍然是其中哪一个更模块化。

如果您愿意用这些来制作一个npm包,那么就不应该在服务器代码中调用express()。相反,您应该将app作为一个参数进行传递。这将允许您重用在其他地方初始化的现有express应用程序。出于这个原因,我会选择gqlServer_02

您还想在每次调用模块函数时创建一个新的服务器,因此我选择server_A。然而,它需要接收expressapp作为参数,以便重用现有的express对象。我还将把app.listen调用放在Server类的函数中。

最新更新