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

NextJS 14中如何仅在Node.js启动时加载MySQL Schema?

在Next.js 14中仅服务器启动时执行一次数据库Schema初始化

核心思路:利用Node.js模块单例特性

Node.js模块在首次导入后会被缓存,后续导入不会重复执行模块内的代码。基于这个特性,我们可以把Schema初始化逻辑封装到单独模块中,在服务器端入口处导入它,实现仅启动时执行一次的效果。

具体实现步骤

  1. 创建数据库初始化模块
    在项目根目录下新建lib/init-db.js,编写初始化逻辑:
import mysql from 'mysql2/promise';
import fs from 'fs/promises';
import path from 'path';

// 防止重复初始化的标志位
let hasInitialized = false;

async function initDatabaseSchema() {
  if (hasInitialized) return;

  try {
    // 读取schema.sql文件内容
    const schemaFilePath = path.join(process.cwd(), 'schema.sql');
    const schemaSql = await fs.readFile(schemaFilePath, 'utf8');

    // 建立数据库连接(注意配置multipleStatements支持多语句执行)
    const connection = await mysql.createConnection({
      host: process.env.MYSQL_HOST,
      user: process.env.MYSQL_USER,
      password: process.env.MYSQL_PASSWORD,
      database: process.env.MYSQL_DATABASE,
      multipleStatements: true, // 关键:允许执行多个SQL语句
    });

    // 执行Schema初始化SQL
    await connection.execute(schemaSql);
    await connection.end();

    hasInitialized = true;
    console.log('✅ 数据库Schema初始化完成');
  } catch (error) {
    console.error('❌ 数据库Schema初始化失败:', error);
    // 可根据业务需求选择抛出错误或忽略
    throw error;
  }
}

// 模块加载时自动执行初始化
initDatabaseSchema().catch(err => console.error('初始化异常:', err));

// 导出函数供其他服务器端代码手动调用(可选)
export { initDatabaseSchema };
  1. 在服务器端入口触发初始化
    在app/layout.js(根布局,服务器组件)中导入上述模块,服务器启动时会自动加载模块并执行初始化:
import './globals.css';
// 导入初始化模块,触发启动时执行
import '@/lib/init-db';

export default function RootLayout({ children }) {
  return (
    <html lang="zh-CN">
      <body>{children}</body>
    </html>
  );
}

关键注意事项

  • 仅在服务器端代码中导入:确保这个初始化模块只在服务器组件、API路由或Server Actions中导入,不要在客户端组件中使用(浏览器环境无法连接MySQL)。
  • 冷启动场景:在Vercel等无服务器部署平台,冷启动时会重新执行初始化逻辑,这是正常现象,因为冷启动会重新加载模块。
  • 多语句执行配置:如果你的schema.sql包含多个SQL语句,必须在MySQL连接配置中添加multipleStatements: true,否则会执行失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:12:33