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
相关产品推荐
相关产品推荐

