Next.js中Drizzle-Kit CLI无法使用及bcrypt-ts模块导入错误排查
问题解决步骤
1. 解决drizzle-kit migrate找不到meta/_journal.json的问题
- 检查
drizzle.config.ts配置,确保schema指向你的db.ts文件,outDir设置为正确的迁移输出目录(比如./drizzle) - 若从未生成过迁移文件,先执行
drizzle-kit generate命令,该命令会自动创建drizzle/meta目录及_journal.json文件 - 若
meta目录已丢失,手动创建drizzle/meta文件夹,再重新运行drizzle-kit generate生成完整迁移结构
2. 解决drizzle-kit push时的bcrypt-ts导入错误
问题根源是drizzle-kit默认使用CommonJS环境,而bcrypt-ts是ES模块,直接在db.ts中导入会导致语法错误。解决方式二选一:
方案一:分离运行时依赖与Schema定义
- 将
bcrypt-ts的哈希逻辑移至API路由或服务器组件中(比如注册用户时在服务器端调用bcrypt.hash处理密码) db.ts仅保留表结构定义,不引入任何运行时依赖,示例:
import { pgTable, varchar } from 'drizzle-orm/pg-core'; export const users = pgTable('users', { id: varchar('id', { length: 255 }).primaryKey(), email: varchar('email', { length: 255 }).unique().notNull(), password: varchar('password', { length: 255 }).notNull(), role: varchar('role', { length: 50 }).notNull().default('user'), });
方案二:为Drizzle单独配置ES模块环境
- 创建
drizzle.config.mjs文件(ES模块格式):
import { defineConfig } from 'drizzle-kit'; export default defineConfig({ schema: './src/db.ts', out: './drizzle', dialect: 'postgresql', // 根据你的数据库类型调整 dbCredentials: { url: process.env.DATABASE_URL, }, });
- 执行
drizzle-kit push时指定该配置文件:drizzle-kit push --config drizzle.config.mjs - 保持
package.json的type为commonjs,避免影响Next.js运行
3. 恢复Next.js正常运行
不要修改package.json的type为module,Next.js对纯ES模块项目的兼容性仍有局限,采用上述方案二单独适配Drizzle的ES模块需求即可。
内容的提问来源于stack exchange,提问作者Jack Duffy
相关产品推荐
相关产品推荐

