Mongoose 连接在所有端点都断开

问题描述 投票:0回答:1

我断断续续地从事一个项目已经有一段时间了。最近,在转换到新计算机和路由器后,我的所有端点都没有响应

我采取了一些故障排除步骤,包括:

  • 删除node_modules并使用npm重新安装依赖项。
  • 调整端口 27016 的入站和出站防火墙规则。
  • 尝试在我的应用程序中 app.listen 端口 27016 和 27017 设置。
  • 从头开始一个新项目。
  • 添加大量控制台日志记录以用于调试目的。
  • 通过 MongoDB Shell 和 VS Code 扩展使用精确 URI 成功连接到 MongoDB 数据库;
  • 我的 app.js 中的初始连接已建立,我可以列出数据库 和收藏没有问题

但是,当我通过邮递员向我的端点发出请求时,猫鼬与 mongodb 的连接似乎意外“断开”。

//User.find and User.findOne timeout
router.get('/all', async (req, res) => {
  try {
    // Fetch all users
    const users = await User.findOne({});
    console.log(users);
    // Respond with the list of users
    res.send(users);
  } catch (error) {
    console.error('Error fetching users:', error);
    res.status(500).json({ error: error.message });
  }
});

“错误”:“操作

users.findOne()
缓冲在10000毫秒后超时”

  router.get('/check-connection', async (req, res) => {
  try {
    console.log('working')
    console.log(mongoose.connection)
    // Ensure the connection is established
    if (mongoose.connection.readyState !== 1) {
      throw new Error('MongoDB connection not established');
    }
    
    // Perform a basic query to the MongoDB server
    const result = await mongoose.connection.useDb.admin().ping();
    console.log('MongoDB Ping Result:', result);
    res.status(200).send('Connection to MongoDB is successful');
  } catch (error) {
    console.error('Error pinging MongoDB:', error);
    res.status(500).json({ error: 'Error connecting to MongoDB: ' + error.message });
  }
});

“错误”:“连接到 MongoDB 时出错:未建立 MongoDB 连接” ping MongoDB 时出错:错误:未建立 MongoDB 连接

您对解决此问题的见解将不胜感激。 更多代码如下: 我的应用程序.js https://playcode.io/1945377

我的基本路由器 - users.js https://playcode.io/1945378

node.js mongodb express mongoose
1个回答
0
投票

哇,我想我已经有一段时间没有从事这方面的工作了,事情已经发生了很大的变化。

每:https://mongoosejs.com/docs/connections.html#keepAlive
如果您使用多个连接,您应该确保导出模式,而不是模型。从文件导出模型称为导出模型模式。导出模型模式有限,因为只能使用一个连接。

const userSchema = new Schema({ name: String, email: String });

导出模型模式的替代方案是导出架构模式。

module.exports = userSchema;

因为如果您导出如下所示的模型,该模型将被限定范围 到 Mongoose 的默认连接。

  module.exports = mongoose.model('User', userSchema);

如果您使用导出模式模式,您仍然需要在某处创建模型。有两种常见的模式。第一个是创建一个函数来实例化新连接并注册该连接上的所有模型。使用此模式,您还可以注册与依赖注入器或其他控制反转 (IOC) 模式的连接。

const mongoose = require('mongoose');

module.exports = function connectionFactory() {
  const conn = mongoose.createConnection(process.env.MONGODB_URI);

  conn.model('User', require('../schemas/user'));
  conn.model('PageView', require('../schemas/pageView'));

  return conn;
};

导出创建新连接的函数是最灵活的模式。但是,该模式可能会使从路由处理程序或业务逻辑所在的位置访问连接变得困难。另一种模式是导出连接并在文件的顶级范围中注册连接上的模型,如下所示。

// connections/index.js
const mongoose = require('mongoose');

const conn = mongoose.createConnection(process.env.MONGODB_URI);
conn.model('User', require('../schemas/user'));

module.exports = conn;

总而言之,我的连接范围似乎仅限于创建连接的位置,因为我导出的是模型而不是架构。我不知道具体是什么改变使得这成为必要,但这是一个半简单的重组。 希望没有人遇到这种情况,但如果是这样的话。问题来了

© www.soinside.com 2019 - 2024. All rights reserved.