Express/Node 依赖项的模式:我可以为 "app" 实例使用单独的服务文件吗?

Pattern for Express/Node dependencies: Can I use a separate services file for "app" instance?

我有一个 express/node 应用程序,我想让该应用程序实例在多个文件中可用,而不 运行 进入循环引用(例如,在 routes 对象包含在 express 中之前,您需要将应用程序对象导出到 routes.js 文件,然后 routes.js 文件又导出回主 app.js 文件)。

虽然我知道路由对象解决了这个用例,但我正在尝试找出不同的模式是否可行/是否是最佳实践。

所以...我可以在需要 express 的地方有一个单独的服务文件,然后在该服务文件中创建应用程序吗?并让我的主根文件夹以及 n 个其他文件夹(每个文件夹都有自己的循环)安全地需要来自该服务的应用程序。

Example Folder structure
├── app.js   // main file; ordinarily would have required routes.js
├── routes
    ├── routes.js // ordinarily would have required top app.js for app object
├── services
    ├── firebase.js
    ├── amplitude.js
    └── app.js // instead, create app here and export it to both above

例如,三个文件可能如下所示:

app.js(主要)

const app = require('./services/app');
app.listen(3000, () => console.log('Listening on port 3000));

routes/routes.js

const app = require('../services/app');
app.get('/', (req, res) => res.send('hello world'));

services/app.js

const express = require('express');
const app = express();
module.exports.app = app;

这是安全/最佳做法吗?

既然是module.exports.app = app,应该不是

const app = require('./services/app');

但是

const { app } = require('./services/app');

它看起来不太优雅,但它会起作用。

由于routes.js,为了中间件和路由正常工作,应该严格按顺序加载等,这种方法不会使它们松散耦合,也不会提供明显的好处。

通常的做法是反其道而行之,在app.js中加载中间件。路由不需要 app 实例,如 this guide 中所述,它们可以使用路由器实例,然后在入口点挂载到 /

routes.js

const express = require('express');
const router = express.Router();

router.get('/', (req, res) => res.send('hello world'));

module.exports = router;

app.js

const express = require('express');
const app = express();

const router = require('./routes');

app.use('/', router);
app.listen(3000, () => console.log('Listening on port 3000'));