Node.js 如何正确地解耦MongoDB

Node.js 如何正确地解耦MongoDB,node.js,mongodb,express,Node.js,Mongodb,Express,我对网络开发还比较陌生。我正在尝试启动node.js/express/mongo项目。我来自C/C++背景,模块组织范式对我来说有点奇怪 目前,在我的server.js中,我使用mongoose创建、连接和初始化我的mongoDB对象,然后传递这个对象查询,在其上插入ect。这似乎不是我应该在server.js中做的事情 通过创建一个单独的模块(例如数据库),我在其中执行所有初始化、选项等,并通过这个新模块返回一个mongodb实例,是否是将Mongo与我的项目松散耦合的正确方法 我以前从未承担

我对网络开发还比较陌生。我正在尝试启动node.js/express/mongo项目。我来自C/C++背景,模块组织范式对我来说有点奇怪

目前,在我的
server.js
中,我使用mongoose创建、连接和初始化我的mongoDB对象,然后传递这个对象查询,在其上插入ect。这似乎不是我应该在
server.js
中做的事情

通过创建一个单独的模块(例如数据库),我在其中执行所有初始化、选项等,并通过这个新模块返回一个mongodb实例,是否是将Mongo与我的项目松散耦合的正确方法

我以前从未承担过这样规模(或类型)的项目,只是不知道如何最好地组织一切。。
对于那些比我更有经验的人提出的任何建议,我们将不胜感激。这里有一些想法

是的,您需要某种路由/处理程序设置,以便不同的模块能够调用不同的服务和/或解耦

下面是一个相当标准的node.js/express结构:

├── server.js
├── config
│   ├── development
│   ├── production
│   └── staging
├── handlers
│   ├── customers.js
│   └── stores.js
├── node_modules
│   ├── assert
│   ├── ejs
│   ├── express
│   ├── forever
│   ├── mongodb
│   └── mongoskin
├── package.json
├── README.md
然后在server.js中,您可以像这样导入处理程序:

// import route handlers
var customers = require('./handlers/customers'),
    stores = require('./handlers/stores');
然后在处理程序中,您可以声明函数:

exports.addCustomer = function(req, res) {
    // ....
};
在server.js中,您可以使用哪个文件进行路由:

app.post('/customers/add/:id, metrics.addCustomer);
那么你就有了一个基本的框架。只需在处理程序文件中的
exports.XXX
函数之外定义数据库连接就可以了,因为这些函数将具有访问权限,但在
server.js
中没有任何内容,因此不会污染命名空间

var url = config.user +":"
        + config.pass +"@"
        + config.host +"/"
        + config.database;

var mongo = require('mongoskin').db(url);
您可以从JSON文件加载
config
对象


希望有帮助。

使用分层和依赖注入。也就是说,有一个单独的数据访问模块,它接收一个MongoDB对象作为init参数,还有一个单独的模块处理该对象的设置并将其传递给数据访问,然后将数据访问内容传递给控制器。这肯定不是一个确定的答案(而且,考虑到节点程序员往往是多么固执己见,我怀疑可能不存在一个明确的答案),但在以下链接中有关于此主题的有趣讨论:,这是一个很好的示例,说明如何组织您的平均应用程序,尽管您不会使用AngularJS。@millimoose感谢您的回复。您介意在回答中详细说明吗?我有点担心confused@gone这主要是一个Cliff's Notes版本的模式,即u在.NET或Java中广泛使用(但适用于任何地方)。我建议搜索“数据访问层”和“依赖注入”看看这些概念如何转化到您的环境中。依赖注入是实现您描述的那种解耦的一种流行方式——其思想是每个组件都不需要知道如何创建它所依赖的其他组件。不幸的是,我对Express或MongoDB不太熟悉,所以我无法提供根据您的设置定制的响应。感谢您的响应!看起来是处理不同请求的好主意。但是,我该如何处理mongo之类的东西,或者使用多个处理程序需要的不同模块?在
server.js
中创建它。然后您可以实际为
require()提供参数
方法,方法如下:
var customers=require('./handlers/customers')(mongo_实例)
然后在那里访问它。当然有很多方法可以做到这一点,但这是一种直接的方法。嗯,这是一个有趣的想法。谢谢!