You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 19:13:11