你如何在 nextjs 的数据库初始化期间执行异步操作?

How do you do async actions during db initialization in nextjs?

我想在数据库初始化阶段创建如下所示的表:

CREATE TABLE IF NOT EXISTS users (
  "id" SERIAL PRIMARY KEY,
  "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "name" TEXT NOT NULL,
)

在正常的服务器设置(即使是异步服务器设置)中做起来很简单,但 nextjs 没有集中的“初始化”阶段。 到目前为止,我想出了这个包装器:

import { setupTables } from "./tables";
import { getDBSingleton } from "./init";


let isInitialized = false;

export async function getDB() {
  const scope = getDBSingleton();

  if (!isInitialized) {
    await setupTables(scope.db);
    isInitialized = true;
  }

  return scope;
}

getDBSingleton() 是来自此响应的函数:

这个包装器确实有效,但需要调用 await getDB() 到每个执行数据库调用的函数中,而不是每个模块调用一次。

有没有更好的方法来处理这个问题?

真正的解决方案是将迁移移动到一个单独的脚本并运行它在构建之前。