MongoClient.connect 仅一次

Ale*_*nes 3 mongodb node.js web-scraping puppeteer

所以在以下函数中,我总是与我的 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);
    });
});
Run Code Online (Sandbox Code Playgroud)

abd*_*rik 5

为每项任务创建连接并不是一个好习惯。

我建议创建一个单独的文件来创建连接并在任何地方都可以使用连接

例子

//db.js

MongoClient.connect(url, {
  useNewUrlParser: true
}, callback, function (err, db) {
  if (err) throw err;
  global.dbo = db.db('testdb');
});  
Run Code Online (Sandbox Code Playgroud)

在你的主服务器文件中,我假设app.js所有中间件都需要它

//app.js
<--All depandent module -->

require('db.js'); // change the path according to your structure.
Run Code Online (Sandbox Code Playgroud)

现在dbo将可用于您的所有应用程序,并在任何地方使用它。

使用单连接和负载也是一种很好的做法,Mongo 本身会创建 pull 来处理并发

根据 Mongo 官方评论:

MongoClient.connect当您的应用程序启动并重用 db 对象时,您打开 do一次。它不是一个单独的连接池,每个 .connect 都会创建一个新的连接池。所以在所有请求中重用一次打开它。

更新

我试图让你的一个功能在这里

function getPrice(callback){
  arrayOfPrices = [];
  dbo.collection('testcollection').find({}).toArray(function(err, arrayOfPrices) {
    if (err) throw err;
    callback(null, arrayOfPrices);
});
}
Run Code Online (Sandbox Code Playgroud)