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

Mongoose操作超时求助:schema.findOne()缓冲超时10000ms

Mongoose操作MongoDB超时:schema.findOne() buffering timed out after 10000ms

问题描述

用Node.js搭建REST API,通过Mongoose连接MongoDB,每次执行数据库操作都会触发超时错误:Mongoose: Operation schema.findOne() buffering timed out after 10000ms。

已确认:

  • MongoDB服务正在运行
  • IP连接权限正常
  • 相同连接方式在其他项目可正常使用
    当前使用移动热点网络,想问这会不会是问题诱因?

相关代码

server.js

const express = require('express');
const app = express();
const cors = require('cors');
const userRoutes = require('../Backend/routes/userRoutes')
const taskRoutes = require('../Backend/routes/taskRoutes')
const mongoose = require('mongoose');


require('dotenv').config()
mongoose.connect(process.env.DB_CONNECTION);
app.use(cors());
app.use(express.json());



app.use(userRoutes)
app.use(taskRoutes)

app.listen(process.env.PORT || 3000 , () => {
    console.log("API is now running.")
});

userRoutes.js

const userController = require('../controllers/userController')
const express = require('express');
const router = express.Router();

router.get('/users/currentUser', userController.getCurrentUserData)

router.get('/users/:userId', userController.getUserData)

router.post('/register', userController.register);

router.post('/login', userController.login);

module.exports = router;

userController 触发错误的login方法

exports.login = async (req, res) => {

    if (!req.body.username || !req.body.password) {
        return res.status(400).send("Missing one or all required request body fields: username, password");
    }

    let existingUser;

    try {
        existingUser = await userSchema.findOne({ username: req.body.username });
    } catch(err) {
        return res.status(500).send("Internal server error."); // 错误触发点
    }

    if (!existingUser) {
        return res.status(404).send('User not found');
    }

    const isPasswordCorrect = await bcrypt.compare(req.body.password, existingUser.password);
    if (!isPasswordCorrect) {
        return res.status(401).send('Invalid credentials');
    }

    let token;
    try {
        token = jwt.sign(
            { userId: existingUser._id, username: existingUser.username, tasks: existingUser.tasks},
            process.env.SECRET,
            { expiresIn: "1h" }
        );
    } catch (err) {
        console.log(err);
        return res.status(500).send("Couldn't create JWT.")
    }

    return res.status(200).json({ token: token });
}

User模型

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');

const userSchema = new mongoose.Schema({
    username:{
        type: String,
        unique: true
    },
    password:{
        type: String
    },
    tasks:{
        type:[mongoose.Types.ObjectId]
    }
})

userSchema.pre('save', async function(next) {
    const salt = await bcrypt.genSalt();
    this.password = await bcrypt.hash(this.password, salt);
    next();
  });

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

.env

DB_CONNECTION="mongodb://localhost:27017/test"
SECRET='test'

解决方案

1. 排查移动热点的可能性

你连接的是本地MongoDB(localhost),理论上移动热点不影响本地环回通信。除非热点修改了本地网络配置(比如强制走代理),这种情况极少。可以切换回有线网络或其他Wi-Fi测试,排除这个变量。

2. 修复Mongoose连接逻辑(核心问题)

你的代码没有等待Mongoose连接成功就启动了服务器、挂载路由,导致数据库操作被缓冲,连接未建立时就触发超时。修改server.js,确保连接成功后再启动服务:

const express = require('express');
const app = express();
const cors = require('cors');
const userRoutes = require('../Backend/routes/userRoutes')
const taskRoutes = require('../Backend/routes/taskRoutes')
const mongoose = require('mongoose');

require('dotenv').config()

async function startServer() {
  try {
    await mongoose.connect(process.env.DB_CONNECTION);
    console.log("MongoDB连接成功");
    
    app.use(cors());
    app.use(express.json());
    
    app.use(userRoutes)
    app.use(taskRoutes)

    app.listen(process.env.PORT || 3000 , () => {
      console.log("API is now running.")
    });
  } catch (err) {
    console.error("MongoDB连接失败:", err);
    process.exit(1); // 连接失败直接退出进程
  }
}

startServer();

3. 修正模型引用错误

在userController中,你用userSchema.findOne(),但模型文件导出的是Mongoose Model对象,不是Schema。确保controller里正确引入Model:

// userController顶部修正引用路径
const User = require('../models/User'); 

// login方法中替换为Model调用
existingUser = await User.findOne({ username: req.body.username });

4. 可选:添加Mongoose连接选项

给mongoose.connect()显式添加兼容性选项,避免版本差异问题:

await mongoose.connect(process.env.DB_CONNECTION, {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

5. 验证本地MongoDB可达性

在终端执行mongosh mongodb://localhost:27017/test,确认能正常连接数据库,排除MongoDB本身的问题。


内容的提问来源于stack exchange,提问作者idk123123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:20:33