首页 > 解决方案 > MongoError:无条件获取所有数据时池被破坏

问题描述

我是 mongoDb 的新手,因为我试图从不同的集合中查询,为了做到这一点,当我从类别集合中获取数据时,我的意思是当我运行 select * from collection 时它会抛出错误,MongoError:池被破坏。

根据我的理解,这是因为一些 find({}) 正在创建一个池并且正在被销毁。

我在模型内部使用的代码如下,

const MongoClient = require('mongodb').MongoClient;
const dbConfig = require('../configurations/database.config.js');

export const getAllCategoriesApi = (req, res, next) => {
  return new Promise((resolve, reject ) => {
    let finalCategory = []
    const client = new MongoClient(dbConfig.url, { useNewUrlParser: true });
    client.connect(err => {

      const collection = client.db(dbConfig.db).collection("categories");
      debugger
      if (err) throw err;
      let query = { CAT_PARENT: { $eq: '0' } };
      collection.find(query).toArray(function(err, data) {
        if(err) return next(err);
        finalCategory.push(data);
        resolve(finalCategory);
        // db.close();
      });
      client.close();
    });
  });
}

当我在这里的发现是我使用的时候

让查询 = { CAT_PARENT: { $eq: '0' } }; collection.find(query).toArray(function(err, data) {})

当我使用 find(query) 时,它会返回数据,但使用 {} 或 $gte/gt 它会引发池错误。

我在控制器中编写的代码如下,

import { getAllCategoriesListApi } from '../models/fetchAllCategory';
const redis = require("redis");
const client = redis.createClient(process.env.REDIS_PORT);

export const getAllCategoriesListData = (req, res, next, query) => {

  // Try fetching the result from Redis first in case we have it cached
  return client.get(`allstorescategory:${query}`, (err, result) => {
    // If that key exist in Redis store
    if (false) {
      res.send(result)
    } else { 
      // Key does not exist in Redis store
      getAllCategoriesListApi(req, res, next).then( function ( data ) {
        const responseJSON = data;
        // Save the Wikipedia API response in Redis store
        client.setex(`allstorescategory:${query}`, 3600, JSON.stringify({ source: 'Redis Cache', responseJSON }));
        res.send(responseJSON)
      }).catch(function (err) {
        console.log(err)
      })
    }
  });
}

谁能告诉我我在这里犯了什么错误。我如何解决池问题。提前谢谢你。

标签: node.jsmongodbmongoosemongodb-querymlab

解决方案


我假设这toArray是异步的(即它调用在结果可用时传入的回调,即从网络读取)。

如果这是真的,则client.close();调用将在读取结果之前执行,因此可能会产生错误。

完成迭代结果后,close需要进行调用。

除此之外,您可能不应该像这样在请求处理程序中创建客户端实例。客户端实例的创建成本很高(它们必须与部署中的所有服务器通信,然后才能真正执行查询),并且通常应该按正在运行的进程而不是按请求创建。


推荐阅读