在Node.js应用程序中分离代码的最佳方法是什么?
我正在开发一个MEAN(Mongo Express.js Angular Node.js)CRUD应用程序。我有它的工作,但一切都在一个.js文件。单个源代码文件相当大。我想重构代码,使CRUD功能位于不同的源代码文件中。通过阅读其他文章,我得到了一个工作模型,但不确定在Node中使用Mongo是否正确 以下是迄今为止的代码:在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'
<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应用到生产中
模块导出中
让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中包含一个部分。变量。