Next.js应用无法向MongoDB创建文档,遇连接超时/拒绝错误
解决Next.js连接MongoDB创建文档失败的问题
问题概述
通过Next.js的/api/product接口发送POST请求创建MongoDB文档时失败,出现连接超时和拒绝连接的错误。
错误信息
MongooseError: Operation
products.insertOne()buffering timed out after 10000ms
at Timeout
at listOnTimeout (node:internal/timers:573:17)
at process.processTimers (node:internal/timers:514:7)
error - unhandledRejection: Error [MongooseServerSelectionError]: connect ECONNREFUSED ::1:27017
at _handleConnectionErrors
at NativeConnection.openUri {
digest: undefined
}
代码修复步骤
1. 修复数据库连接文件(connectDB.js)
原代码未等待连接完成、未处理连接错误,且未避免重复连接,修改如下:
import mongoose from 'mongoose' const connectDB = async () => { // 如果已连接,直接返回 if (mongoose.connection.readyState === 1) { return; } try { await mongoose.connect(process.env.MONGO_URI, { dbName: '你的数据库名称', // 若连接URI未指定数据库名,在此补充 useNewUrlParser: true, useUnifiedTopology: true, }); console.log('MongoDB连接成功'); } catch (err) { throw new Error(`MongoDB连接失败: ${err.message}`); } }; export default connectDB;
2. 修复API路由文件(/api/product.js)
原代码存在响应重复发送的问题,同时补充请求体校验:
import connectDB from "@/libs/connectDB" import Product from "@/models/Product.model.js" export default async function handler(req, res) { try { await connectDB(); if (req.method === 'GET') { const products = await Product.find(); return res.status(200).json({ products }); } else if (req.method === 'POST') { // 校验必填字段 const requiredFields = ['title', 'desc', 'slug', 'img', 'category', 'price', 'availableQty']; const missingFields = requiredFields.filter(field => !req.body[field]); if (missingFields.length > 0) { return res.status(400).json({ error: `缺少必填字段: ${missingFields.join(', ')}` }); } const product = await Product.create(req.body); return res.status(201).json({ product }); } else { return res.status(405).json({ error: '不允许的请求方法' }); } } catch (err) { console.error(err); res.status(500).json({ error: err.message || '服务器内部错误' }); } }
额外检查项
- 环境变量验证:确保
process.env.MONGO_URI配置正确,本地MongoDB的URI格式通常为mongodb://localhost:27017/你的数据库名;若使用MongoDB Atlas,需复制包含用户名、密码的完整连接字符串。 - MongoDB服务状态:本地环境需确认MongoDB服务已启动,端口27017未被占用。
- 接口路径匹配:确认请求发送的路径是
/api/product(而非/api/products),与代码文件路径一致。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

