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

时间:2017-05-17 11:03:22

标签: node.js mongodb express

我正在研究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函数内部的搜索功能。此功能必须成功执行以确保变量&#39; db&#39;在传递两个变量&#39; app&#39;之前有效。和&#39; db&#39;到源代码文件serverSearch.js中构建的搜索功能。

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

相同的区域中

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

1 个答案:

答案 0 :(得分:0)

您基本上描述的是模块化编码,即“服务”,甚至是微服务。您的系统需要记住几个因素。 (我毫不怀疑,还有很多其他方法可以解决这个问题)。基本上在我工作的大多数NodeJS系统中(并非所有)我尝试在开发中应用以下架构,然后尽可能地将其带到生产中。

  1. 在主要目录下创建一个目录。我通常使用某种类型的名称来指向术语函数。在这个目录中,我将函数和/或类文件分为几类。 DB的函数包装器将保存在DB函数中。此文件包含数据库的功能。安全功能在另一个文件中。助手在另一个人中起作用。时间操纵在另一个。我相信你明白了。这些都包含在module exports
  2. 现在,在我的项目中的任何文件中,我需要数据库和帮助程序,我将通过以下方式启动它:

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

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

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

    我花了一些时间来解决这个方法并对其进行改进。 它为我带来了回报。希望这可以帮助。

    编辑以澄清OP:

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

    这个小包装给我带来了令人难以置信的麻烦。当然,您必须决定是否将其包含在生产中。我已经看到了两者的论点,但我认为在一个设置良好的AWS,Google,Azure环境(当然还是在Docker中)我认为它可以安全地使用。 几个警告。

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

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

    3. 如果你把访问信息之类的env变量放到你的数据库系统或其他敏感的东西中,首先要把哈希放在你的env中,并在你的代码中有一个函数,它专门用于字符串的哈希。 在任何情况下都不要在您的环境文件中保留敏感信息而不先对其进行散列。

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

    5. 上面有任何错别字,请原谅。从我在火车上的牢房中完成。

相关问题