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

NextJS中MongoDB连接代码复用的正确存放路径及报错解决

NextJS中MongoDB连接复用的目录问题及解决方案

核心问题原因

你遇到的dns模块解析错误,本质是NextJS误将dbConnect.js的代码打包到了客户端环境,而浏览器没有Node.js的dns核心模块(MongoDB驱动依赖该模块做域名解析)。

目录选择建议

辅助文件不需要局限于/pages或/api目录,推荐在项目根目录下创建自定义目录(比如/utils、/helpers)来存放dbConnect.js,这样更符合代码结构规范。

当然,你也可以放在/pages/api目录下——这个目录下的文件默认只会在服务端运行,但该目录主要用于编写API路由,放工具函数并不太贴合其设计初衷。

关键解决要点:确保仅在服务端执行

getStaticProps和getStaticPaths本身就是仅在服务端运行的函数,只要你只在这两个函数内部导入并调用dbConnect,就不会被打包到客户端代码中:

  • 不要在组件的顶层(NextJS 12及之前的页面组件)导入dbConnect.js,避免被客户端打包;
  • NextJS 13+的App Router模式下,服务端组件可以直接导入该文件,因为服务端组件全程在服务端运行。

标准dbConnect.js示例

import mongoose from 'mongoose';

const MONGODB_URI = process.env.MONGODB_URI;

if (!MONGODB_URI) {
  throw new Error('请在环境变量中配置MONGODB_URI');
}

// 缓存连接,避免重复创建数据库连接
let cached = global.mongoose;
if (!cached) {
  cached = global.mongoose = { conn: null, promise: null };
}

async function dbConnect() {
  if (cached.conn) {
    return cached.conn;
  }

  if (!cached.promise) {
    const opts = {
      bufferCommands: false,
    };
    cached.promise = mongoose.connect(MONGODB_URI, opts).then(mongoose => mongoose);
  }
  
  cached.conn = await cached.promise;
  return cached.conn;
}

export default dbConnect;

在getStaticProps中的使用示例

export async function getStaticProps() {
  // 仅在服务端函数内部导入并调用
  const dbConnect = require('../utils/dbConnect').default;
  await dbConnect();

  // 执行数据库查询操作
  const data = await YourMongoModel.find({});
  
  return {
    props: { data: JSON.parse(JSON.stringify(data)) }
  };
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:10:03