【发布时间】:2014-07-03 07:17:26
【问题描述】:
以前我使用 mongodb 和 php 并查询我使用单例的数据库。这样我只实例化了一次连接,然后重用它:
class MDB{
protected static $instance;
public static function use(){
if(!self::$instance) self::$instance = new MongoClient();
$db = self::$instance->selectDB('DB_name');
return $db;
}
}
我可以创建类 Cats 并拥有 addCat 和 showCats 方法,如下所示:
MDB::use->{'cats'}->insert([...]);
MDB::use->{'cats'}->find([...]);
现在我开始使用 mongodb 和 node.js。 Mongodb tutorial 向我展示了这样的内容:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) {
if(err) { return console.dir(err); }
var collection = db.collection('test');
var doc1 = {'hello':'doc1'};
collection.insert(doc1);
});
这基本上告诉我,我必须将所有节点操作设置为连接内的回调。阅读类似question的人提供:
当您的应用启动并重用时,您打开一次 MongoClient.connect 数据库对象。每个 .connect 都不是单例连接池 创建一个新的连接池。
但我不明白我应该如何使用它(例如我的 cat 类)?
【问题讨论】:
-
基本节点驱动程序本身是相当低级的。有多种实现可以为您抽象出此类工作。在有人认为“使用猫鼬”是一个答案之前,请注意这一点。所以这里的问题是,你真的想在这么低的水平上工作吗?如果是这样,那么它是关于如何获取该连接实例以便您可以在其他地方使用它,是吗?
-
@NeilLunn 现在对我来说看起来并不低级。我也不需要猫鼬提供的所有模式验证。根据我之前在这里回答 mongo 问题的经验,我注意到并非所有库都实现了所有功能。同样基于我之前构建 php/node 应用程序的经验,我能够使用 vanilla mongo 创建体面的应用程序。回到你的最后一个问题:据我所知,mongodb.github.io/node-mongodb-native/driver-articles/… 我可以将 db 传递给我的类方法。
-
我并不打算提倡特定的实现,而是指出在其他“抽象”库之前已经完成了很多工作。并且相当多的工作是开源的,所以有地方可以看看它是如何完成的。我明白你在这里想要什么,这是一个单例实例,你可以从中请求连接,而不是到处传递它。我真的只是说,“其他东西已经这样做了”,所以如果你不想使用它们,你仍然可以借一些代码。
-
@NeilLunn 如果您能指出一些这样做的图书馆,我将不胜感激。现在我知道 mongoose 和 mongojs。
-
mongoskin 和mongo 有一些相当简化的实现,你可以看看。不过,按照您的 PHP 代码行的 Javascript 中的单例并不难。并且 asnwers 与已经存在的一般 javascript 答案并没有真正的不同。所以我真的只是在探索你是否真的想这样做。