以前我使用 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教程 http://mongodb.github.io/node-mongodb-native/api-articles/nodekoarticle1.html#and-then-there-was-crud向我展示了这样的东西:
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 https://stackoverflow.com/a/14464750/1090562该人提供:
当您的应用程序启动并重复使用时,您打开 do MongoClient.connect 一次
数据库对象。它不是每个 .connect 的单例连接池
创建一个新的连接池。
但我不明白我应该如何使用它(例如我的猫类)?
这是在单例上使用异步等待的内容。
在我的db.js
var MongoClient = require('mongodb').MongoClient;
var DbConnection = function () {
var db = null;
var instance = 0;
async function DbConnect() {
try {
let url = 'mongodb://myurl.blablabla';
let _db = await MongoClient.connect(url);
return _db
} catch (e) {
return e;
}
}
async function Get() {
try {
instance++; // this is just to count how many times our singleton is called.
console.log(`DbConnection called ${instance} times`);
if (db != null) {
console.log(`db connection is already alive`);
return db;
} else {
console.log(`getting new db connection`);
db = await DbConnect();
return db;
}
} catch (e) {
return e;
}
}
return {
Get: Get
}
}
module.exports = DbConnection();
在所有将使用相同连接的模块中
var DbConnection = require('./db');
async function insert(data) {
try {
let db = await DbConnection.Get();
let result = await db.collection('mycollection').insert(data);
return result;
} catch (e) {
return e;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)