node.js - 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)
})
}
});
}
谁能告诉我我在这里犯了什么错误。我如何解决池问题。提前谢谢你。
解决方案
我假设这toArray
是异步的(即它调用在结果可用时传入的回调,即从网络读取)。
如果这是真的,则client.close();
调用将在读取结果之前执行,因此可能会产生错误。
完成迭代结果后,close
需要进行调用。
除此之外,您可能不应该像这样在请求处理程序中创建客户端实例。客户端实例的创建成本很高(它们必须与部署中的所有服务器通信,然后才能真正执行查询),并且通常应该按正在运行的进程而不是按请求创建。
推荐阅读
- ruby-on-rails - Docker 中的 Rails 活动存储
- c# - 如何对对象中的对象值列表进行排序
- typescript - Typescript 自动获取类中的接口属性
- android - 文件观察器在某些设备上不起作用
- pytorch - 运行卷积自动编码器 RuntimeError 时出错:张量的元素 0 不需要 grad 并且没有 grad_fn
- python-3.x - cryptography.Fernet 为什么解密仍然适用于修改后的令牌
- jquery - 如何在网站可见时触发动画?
- php - MySQL - PHP 地理定位:如何知道 GPS 位置属于哪个区域
- haskell - 实现尾递归
- python - Tensorflow NMT with Attention 教程——需要帮助理解损失函数