在 Node.js 应用程序中分离代码的最佳方法是什么?



我正在开发一个MEAN(Mongo Express.js Angular Node.js)CRUD应用程序。 我让它工作,但一切都在一个.js文件中。 单个源代码文件非常大。我想重构代码,以便 CRUD 功能位于不同的源代码文件中。 通读其他帖子,我有一个工作模型,但不确定它是使用 Mongo 完成它的 Node 的正确方法。

这是到目前为止的代码:

<pre>
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
var path = require('path');
var db;
var connect = 'mongodb://<<mddbconnect string>>;
const MongoClient = require('mongodb').MongoClient;
var ObjectID = require("mongodb").ObjectID;
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static(__dirname + '/'));
// viewed at http://localhost:<<port referecnes in app.listen>>
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname + '/index.html'));
});
MongoClient.connect(connect, (err, database) => {
if (err) return console.log(err)
db = database
app.listen(3000, () => {
console.log('listening on 3000' + Date() );
// Here's the require for the search function in another source code file.
var searchroute = require('./serverSearch')(app, db);
})
})
//Handlers
The rest of the CRUD application functions with app.post, app.get.  These are other functions I want to move into different source code files, like serverSearch.js.
</pre>

我现在分离的代码是MongoClient.connection函数内部的搜索功能。 此函数必须成功执行以确保变量"db"有效,然后再将变量"app"和"db"传递给源代码文件serverSearch.js中构建的搜索函数。

我现在可以在单独的文件中构建我的其他 CRUD 函数,将它们放在与"var searchroute = require('./serverSearch)(app,db) 相同的区域中;

这是在 MEAN 应用程序中分离代码的最佳方式,其中主应用程序和数据库变量需要实例化,然后传递给其他源代码文件中的函数?

你基本上描述的是模块化编码,朝着"服务"甚至微服务的方向发展。对于您的系统,有几个因素需要牢记。(顺便说一句,我毫不怀疑还有许多其他方法)。基本上,在我处理过的大多数 NodeJS 系统(不是全部)中,我尝试在开发中应用以下架构,然后尽可能多地将 I 带到生产环境中。

  1. 在主目录下创建一个目录。我通常使用某种指向术语函数的名称。在这个目录中,我维护了按类别划分的函数和/或类文件。数据库的函数包装器将保存在数据库函数中。此文件包含数据库的函数。另一个文件中的安全功能。帮助程序在另一个中起作用。时间操纵在另一个。我相信你明白了。这些都包裹在module exports

现在,在我的项目中的任何文件中,如果说我需要数据库和助手,我将通过以下方式启动它:

let nhelpers = require("helpfuncs");let ndb = require("dbfuncs");

显然名字是不同的。 顺便说一句,我在环境目录下以相同的方式划分所有 NPM 包。

通过保持这种结构,您可以保持代码的合理顺序,在任何体面的 IDE 中保持逻辑链接,并在 IDE 中显示相关方法,而无需记住每个函数名称和其中的所有方法。 它还允许您编写一个有序的微服务系统,确保每个部分都完全按照您想要的方式死亡,并允许进行理智的调试。

我花了一段时间才确定这种方法并对其进行完善。 它为我带来了回报。希望这有帮助。

编辑以澄清 OP:

当谈到process.env变量时,我成为了dotenv https://www.npmjs.com/package/dotenv 的忠实粉丝

这个小包裹为我节省了难以置信的头痛。当然,您必须决定是否将其包含在生产中。我已经看到了两者的论点,但我认为在一个设置良好的AWS,谷歌,Azure环境(当然还是在Docker中),我认为它可以安全地使用。 有几个警告。

  1. 不要将 dotenv 文件留在根目录中。将其移动到目录结构中的其他位置。这很简单,我实际上将其放在与所有环境文件和帮助程序文件相同的目录中。

  2. 请记住,它只是一个文本文件。因此,IDE 不会在链接中选取特定的 env 变量。(除非有人知道我很想听的技巧)

  3. 如果您将 env 变量(如访问信息)放入数据库系统或其他敏感内容,请先对它们进行哈希处理,将哈希放入您的 env 中,并在代码中有一个函数专门对字符串进行哈希处理。在任何情况下,都不要在未先对其进行哈希处理的情况下将敏感信息留在环境文件中。

  4. 最后的嘎查。这些不是无法覆盖的 PHP 魔术全局变量。如果您丢失了跟踪并覆盖了代码中的其中一个 process.env 变量,它将采用新值,直到您重新启动节点应用程序并再次从 dotenv 文件中读取。(但话又说回来,这是所有环境变量的规则,而不仅仅是用户定义的变量)

上面的任何错别字都对不起。在火车上的牢房里完成。

相关内容

最新更新