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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:33:18