因此,在以下功能中,我总是与mongodb建立新的连接。我将如何更改代码,使其仅在开始时连接一次,而不是在所有这些函数中连接一次。
function getData(callback){
arrayOfArticles = [];
MongoClient.connect(url, { useNewUrlParser: true }, callback, function(err, db) {
if (err) throw err;
let dbo = db.db('testdb');
article = dbo.collection('testname').find({}).toArray(function(err, article) {
if (err) throw err;
db.close();
for (var i = 0, len = article.length; i < len; i++){
arrayOfArticles.push(article[i].name);
}
callback(null, arrayOfArticles);
});
});
function getPrice(callback){
arrayOfPrices = [];
MongoClient.connect(url, { useNewUrlParser: true }, callback, function(err, db) {
if (err) throw err;
let dbo = db.db('testdb');
article = dbo.collection('testcollection').find({}).toArray(function(err, arrayOfPrices) {
if (err) throw err;
db.close();
callback(null, arrayOfPrices);
});
});
function getDealerData(callback){
dealerData = [];
MongoClient.connect(url, { useNewUrlParser: true }, callback, function(err, db) {
if (err) throw err;
let dbo = db.db('Dealer');
article = dbo.collection('Dealer').find({}).toArray(function(err, dealerData) {
if (err) throw err;
db.close();
callback(null, dealerData);
});
});
答案 0 :(得分:1)
我发现从上一个答案得到的这段代码非常有用...
它将集合存储在应用程序本地系统中,而不是单独的文件。
MongoClient.connect(url, { useNewUrlParser: true })
.then(client => {
const dbo = client.db('myDB');
const collection = dbo.collection('numbers');
app.listen(port2, () => console.info(`REST API running on port ${port2}`));
app.locals.collection = collection; // this line stores the collection from above so it is available anywhere in the app, after small delay.
}).catch(error => console.error(error));
答案 1 :(得分:0)
为每个任务创建连接不是一个好习惯。
我建议为创建连接创建一个单独的文件,并在任何地方都可以使用该连接
示例
// db.js
MongoClient.connect(url, {
useNewUrlParser: true
}, callback, function (err, db) {
if (err) throw err;
global.dbo = db.db('testdb');
});
在您的主服务器文件中,我假设app.js
并要求所有中间件位于顶部
//app.js
<--All depandent module -->
require('db.js'); // change the path according to your structure.
现在dbo
将可用于您所有的应用程序,并随处使用。
使用单连接也是一种好习惯,对于负载,Mongo本身会创建拉动来处理并发
根据Mongo官方评论:
您的应用程序启动并重复使用db对象时,您一次打开
MongoClient.connect
。每个.connect都不是一个单例连接池。因此,一旦在所有请求中重复使用,就将其打开。
更新
我试图在这里使您的功能
function getPrice(callback){
arrayOfPrices = [];
dbo.collection('testcollection').find({}).toArray(function(err, arrayOfPrices) {
if (err) throw err;
callback(null, arrayOfPrices);
});
}