gpt4 book ai didi

javascript - Node.js Mongodb-原生驱动连接共享

转载 作者:可可西里 更新时间:2023-11-01 09:56:41 26 4
gpt4 key购买 nike

ma​​in.js

var http = require('http');
var UserModel = require('./models/user.js');
var server = http.createServer(function(req, res){
UserModel.create({
}), function(e, o){
if(e) { console.log(e); } else {
} console.log(o); }
});
}).listen(3000);

connections.js

var mongo = require('mongodb');

module.exports = {
dbMain: new mongo.Db('main', new mongo.Server('127.0.0.1', 27017, { auto_reconnect: true }, {})),
dbLog: new mongo.Db('log', new mongo.Server('127.0.0.1', 27017, { auto_reconnect: true }, {}))
};

/models/user.js

var mongodb = require('mongodb');
var db = require('./connections.js').dbMain;

module.exports = {
create: function(newData, callback){
db.open(function(e, db){
db.collection('users', function(e, collection){
collection.insert(newData, callback);
});
});
}
}

当我使用上面的代码时,服务器崩溃了,第二次请求进来时,我们仍然打开了数据库连接,所以让我们将 db.close 添加到我们的 Users.create 函数中。

  create: function(newData, callback){
db.open(function(e, db){
db.collection('users', function(e, collection){
collection.insert(newData, function(e, o){
db.close(); // Voila.
callback(e, o);
});
});
});
}

在这个阶段,服务器仍然会崩溃,因为打开了多个连接,我不明白为什么会发生这种情况或如何发生,但它确实发生了。

如何将我的项目组织成模型(我不想使用 Mongoose,我的验证是在不同的层而不是模型中完成的,所以 Mongoose 对我来说太过分了)?另外,我如何处理项目中的连接?

最佳答案

你可以有一个很好地包装所有这些的库 - 这意味着只有一个到数据库的连接将被打开并且相同的(打开的)连接将被返回用于第二个请求 - 如果你每秒获得 1000+ ,这是一个成败攸关的问题(即不重新打开每个请求的连接)...

users.js:

var connections = require('./connections.js');

var serverCache = connections('127.0.0.1', 27017);

module.exports = {
create: function(newData, callback){
serverCache('main', 'users', function(e, collection){
collection.insert(newData, callback);
})
}
}

connections.js

var mongo = require('mongodb');

// a mongo connection cache
// pass in host & port
// it returns a function accepting dbName, collectionName & callback
var mongoCache = function(host, port){

// keep our open connections
var mongoDatabases = {};

var ensureDatabase = function(dbName, readyCallback){
// check if we already have this db connection open
if(mongoDatabases[dbName]){
readyCallback(null, mongoDatabases[dbName]);
return;
}

// get the connection
var server = new mongo.Server(host, port, {auto_reconnect: true});

// get a handle on the database
var db = new mongo.Db(dbName, server);
db.open(function(error, databaseConnection){
if(error) throw error;

// add the database to the cache
mongoDatabases[dbName] = databaseConnection;

// remove the database from the cache if it closes
databaseConnection.on('close', function(){
delete(mongoDatabases[dbName]);
})

// return the database connection
readyCallback(error, databaseConnection);
})
}

var ensureCollection = function(dbName, collectionName, readyCallback){

ensureDatabase(dbName, function(error, databaseConnection){
if(error) throw error;

databaseConnection.createCollection(collectionName, function(error, collection) {
if(error) throw error;

// return the collection finally
readyCallback(error, collection);
})

})
}

return ensureCollection;
}

module.exports = mongoCache;

关于javascript - Node.js Mongodb-原生驱动连接共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12037655/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com