MongoClient.connect仅一次

时间:2018-08-14 12:33:05

标签: node.js mongodb 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);
    });
});

2 个答案:

答案 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);
});
}