MongoError: пул уничтожается при получении всех данных без условий - PullRequest
0 голосов
/ 02 мая 2020

Я новичок в mongoDb, так как я пытаюсь сделать запрос из другой коллекции и для этого, когда я выбираю данные из коллекции категорий, я имею в виду, когда я запускаю команду select * from collection, она выдает ошибку, MongoError: бассейн разрушен.

Насколько я понимаю, это потому, что какая-то находка ({}) создает пул, а он уничтожается.

Код, который я использую внутри модели, приведен ниже,

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();
    });
  });
}

Когда я нахожу здесь, когда я использую

let query = {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)
      })
    }
  });
}

Может кто-нибудь сказать мне, какую ошибку я здесь делаю. Как я могу решить проблему с пулом. Заранее благодарю.

1 Ответ

0 голосов
/ 02 мая 2020

Я предполагаю, что toArray является асинхронным (то есть он вызывает обратный вызов, переданный, когда результаты становятся доступными, то есть считывание из сети).

Если это правда, вызов client.close(); будет получен выполняется до того, как будут прочитаны результаты, что, вероятно, приведет к вашей ошибке.

Вызов close необходимо выполнить после завершения итерации результатов.

Отдельно от этого вам, вероятно, следует не создавать экземпляр клиента в обработчике запросов, как это. Создание клиентских экземпляров обходится дорого (они должны общаться со всеми серверами в развертывании, прежде чем они смогут фактически выполнять запросы), и обычно их следует создавать для каждого выполняемого процесса, а не для запроса.

...