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

在Node.js应用程序中分离代码的最佳方法是什么?,node.js,mongodb,express,Node.js,Mongodb,Express,我正在开发一个MEAN(Mongo Express.js Angular Node.js)CRUD应用程序。我有它的工作,但一切都在一个.js文件。单个源代码文件相当大。我想重构代码,使CRUD功能位于不同的源代码文件中。通过阅读其他文章,我得到了一个工作模型,但不确定在Node中使用Mongo是否正确 以下是迄今为止的代码: <pre> var express = require('express'); var bodyParser = require('body-parser'

我正在开发一个MEAN(Mongo Express.js Angular Node.js)CRUD应用程序。我有它的工作,但一切都在一个.js文件。单个源代码文件相当大。我想重构代码,使CRUD功能位于不同的源代码文件中。通过阅读其他文章,我得到了一个工作模型,但不确定在Node中使用Mongo是否正确

以下是迄今为止的代码:

<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>

var express=需要(“express”);
var bodyParser=require('body-parser');
var-app=express();
var path=require('path');
var-db;
var connect='mongodb://;
const MongoClient=require('mongodb')。MongoClient;
var ObjectID=要求(“mongodb”).ObjectID;
use(bodyParser.json());
use(bodyParser.urlencoded({extended:true}));
应用程序使用(express.static(u dirname+'/');
//观看http://localhost:
应用程序获取(“/”,(请求,请求)=>{
res.sendFile(path.join(uu dirname+'/index.html');
});
MongoClient.connect(连接,(错误,数据库)=>{
if(err)返回console.log(err)
db=数据库
app.listen(3000,()=>{
log('3000'监听+Date());
//下面是另一个源代码文件中搜索函数的要求。
var searchroute=require('./serverSearch')(应用程序,数据库);
})
})
//处理者
其余的CRUD应用程序功能包括app.post、app.get。这些是我想转移到不同源代码文件中的其他函数,比如serverSearch.js。
我现在分离的代码是MongoClient.connection函数中的搜索功能。在将变量“app”和“db”传递给源代码文件serverSearch.js中内置的搜索函数之前,必须成功执行此函数以确保变量“db”有效

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


在一个普通应用程序中,如果主应用程序和db变量需要实例化,然后传递给其他源代码文件中的函数,那么这是分离代码的最佳方法吗?

您基本上描述的是朝着“服务”甚至微服务的模块化编码。对于您的系统,有几个因素需要记住。(顺便说一句,我毫不怀疑还有许多其他方法)。基本上,在我工作过的大多数NodeJS系统(不是全部)中,我尝试在开发中应用以下体系结构,然后将尽可能多的NodeJS应用到生产中

  • 在主目录下创建一个目录。我通常使用某种类型的名称来指向术语函数。在此目录中,我将函数和/或类文件划分为多个类别。DB的函数包装将保存在DB函数中。此文件仅包含数据库的函数。另一个文件中的安全功能。助手在另一个系统中起作用。时间操纵在另一个领域。我相信你明白了。这些都包装在
    模块导出中
  • 现在,在我的项目中的任何文件中,如果说我需要DB和助手,我将从以下开始:

    让nhelpers=require(“helpfuncs”)
    
    让ndb=require(“dbfuncs”)

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

    维护这种结构允许您在代码上保持合理的顺序,在任何合适的IDE中保持逻辑链接,并在IDE中显示相关方法,而不必记住其中的每个函数名和所有方法。 它还允许您编写一个有序的微服务系统,以确保每个部分都完全符合您的要求,并允许进行合理的调试

    我花了一段时间才确定这个方法并加以改进。 我得到了回报。希望这有帮助

    编辑以澄清OP:

    当谈到
    process.env
    变量时,我成了dotenv的超级粉丝

    这个小包裹帮我省去了很多麻烦。当然,您必须决定是否将其包括在生产中。我已经看到了这两种观点的论据,但我认为在一个设置良好的AWS、谷歌、Azure环境中(当然在Docker中),我认为它可以安全地使用。 有几个警告

  • 不要将dotenv文件保留在根目录中。将其移动到目录结构中的其他位置。它很简单,我实际上把它和我所有的环境文件和助手文件放在同一个目录中

  • 请记住,它只是一个文本文件。因此IDE不会在链接中获取特定的环境变量。(除非有人知道我想听的把戏)

  • 如果您将诸如access info之类的环境变量放入DB系统或其他敏感内容,请首先对它们进行哈希,将哈希放入环境中,并在代码中使用一个函数专门对字符串进行哈希在任何情况下,如果不先对环境文件进行哈希处理,请不要将敏感信息留在环境文件中。

  • 最后的加查。这些不是无法覆盖的PHP幻球。如果丢失跟踪并覆盖代码中的某个process.env变量,它将接受新值,直到您重新启动节点应用程序并再次从dotenv文件读取为止。(但这也是所有环境变量的规则,而不仅仅是用户定义的变量)


  • 对不起,上面有错吗。在火车上我的牢房里做的

    谢谢,你们共享全局变量吗?而且,我想象您的dbfuncs目录在单独的文件中有几个微函数,并且在Mongo中有一些db操作,按类型添加错误检查,可能会很长。@Jef我将编辑上面的答案,因为我想在env中包含一个部分。变量。