如何在 Next.js 应用中根据运行环境连接到不同的 MongoDB 数据库

366 阅读1分钟

1. 安装依赖

确保你安装了 mongoosedotenv

npm install mongoose dotenv

2. 配置环境变量

在项目根目录下创建两个环境变量文件:.env.development.env.production

.env.development

MONGODB_URI=mongodb://localhost:27017/development_db

.env.production

MONGODB_URI=mongodb://localhost:27017/production_db

3. 修改 next.config.js

确保 next.config.js 文件中使用 dotenv 来加载环境变量:

// next.config.js
const { PHASE_DEVELOPMENT_SERVER, PHASE_PRODUCTION_BUILD } = require('next/constants');
const dotenv = require('dotenv');

module.exports = (phase) => {
  if (phase === PHASE_DEVELOPMENT_SERVER) {
    dotenv.config({ path: '.env.development' });
  } else if (phase === PHASE_PRODUCTION_BUILD) {
    dotenv.config({ path: '.env.production' });
  }

  return {
    env: {
      MONGODB_URI: process.env.MONGODB_URI,
    },
  };
};

4. 创建数据库连接文件

创建一个文件 src/mongodb.ts 来设置和管理 MongoDB 连接:

// lib/mongodb.ts
import mongoose from 'mongoose';

const MONGODB_URI = process.env.MONGODB_URI as string;

if (!MONGODB_URI) {
  throw new Error(
    'Please define the MONGODB_URI environment variable inside .env.development or .env.production'
  );
}

/**
 * Global is used here to maintain a cached connection across hot reloads
 * in development. This prevents connections growing exponentially
 * during API Route usage.
 */
let cached = (global as any).mongoose;

if (!cached) {
  cached = (global as any).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) => {
      return mongoose;
    });
  }
  cached.conn = await cached.promise;
  return cached.conn;
}

export default dbConnect;

5. 启动 Next.js 应用

根据环境来启动你的应用:

开发环境

npm run dev

生产环境

npm run build
npm start

总结

使用不同的 .env 文件来存储环境变量,并在 next.config.js 中加载相应的文件,从而在不同的环境中连接到不同的数据库。