调用getUser函数时Mongoose连接为何自动断开?
MongoDB连接在调用getUser函数后断开的解决方案
问题现状
Express服务器启动时能正常连接MongoDB(打印Connected to MongoDB),但调用/getUser路由进入getUser()函数后,数据库连接状态从1(已连接)变为0(断开),无法查询用户数据。已重装同版本Mongoose,此前代码可正常运行。
终端输出状态:
Connected to MongoDB Server started on port 3001 1 1 0 0
根因分析
问题出在getUser函数内重复注册Mongoose模型:每次调用函数都执行const User = mongoose.model("user", userSchema,"users");,Mongoose不允许重复注册同名模型,重复调用model()方法会覆盖原有模型实例,干扰已建立的数据库连接,导致连接意外断开。
修复步骤
1. 单独注册并导出Mongoose模型
创建独立的模型文件(如models/User.js),只注册一次模型:
// models/User.js const mongoose = require("mongoose"); const userSchema = require("../schemas/userSchema"); // 仅注册一次User模型,避免重复创建 const User = mongoose.model("user", userSchema, "users"); module.exports = User;
2. 修改getUser函数,复用已注册的模型
在getUser函数中直接导入提前定义好的模型,不再重复创建:
// services/getUser.js const mongoose = require("mongoose"); const User = require("../models/User"); // 导入已注册的模型 async function getUser(username){ console.log(mongoose.connection.readyState); const foundUser = await User.findOne({user: username}); return foundUser; } module.exports.getUser = getUser;
3. 可选:优化MongoDB连接配置
在服务器启动的连接代码中添加保活配置,避免连接因闲置断开:
app.listen(PORT, async () => { try { await mongoose.connect(connectionString, { keepAlive: true, keepAliveInitialDelay: 300000 // 5分钟保活心跳 }); console.log("Connected to MongoDB"); console.log(`Server started on port ${PORT}`); } catch (error) { console.error("Error connecting to MongoDB:", error); } });
验证效果
修改完成后重启服务器,调用/getUser路由,终端打印的连接状态应全程保持为1,且能正常返回用户数据。
内容的提问来源于stack exchange,提问作者Marcelo Marques
相关产品推荐
相关产品推荐

