Prisma db seed与TypeScript导入及type:module配置问题求助
解决Prisma Seed命令中的ES模块与ts-node冲突问题
看起来你遇到的是Node.js模块系统(CommonJS vs ES模块)和ts-node兼容性的问题,我来一步步帮你解决:
先处理Prisma的警告(非错误但建议修复)
首先看Prima给出的两个警告,先顺手解决:
- 移除
--preview-feature参数,因为prisma db seed已经正式发布(GA),直接运行npx prisma db seed即可 - 如果你的
package.json里有旧的ts-node脚本,可以直接删除,Prisma 3.0+不再需要它
核心错误原因分析
- 第一个错误
SyntaxError: Cannot use import statement outside a module:Node.js默认使用CommonJS模块系统,而你的seed.ts用了ES模块的import语法,所以报错。 - 添加
"type":"module"后,Node切换到ES模块模式,但ts-node默认不支持在ES模块模式下处理.ts文件,所以出现ERR_UNKNOWN_FILE_EXTENSION错误。
解决方案(选其一即可)
方案一:改用CommonJS语法(最简单,无需额外配置)
把你的prisma/seed.ts中的ES模块语法改成CommonJS:
// 替换原来的import语句 const { PrismaClient } = require('@prisma/client'); const prisma = new PrismaClient(); // 后续的seed逻辑保持不变,比如: async function main() { // 你的seed代码 } main() .catch((e) => { console.error(e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });
然后:
- 移除
package.json中的"type": "module" - 运行
npx prisma db seed即可
方案二:继续使用ES模块(需要配置ts-node支持)
如果你想保留ES模块的import语法,可以按以下步骤操作:
- 确保
package.json中保留"type": "module" - 修改
prisma/schema.prisma中的seed命令,添加--esm参数让ts-node支持ES模块:generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" // 你的数据库类型 url = env("DATABASE_URL") } // 修改这里的seed命令 seed dev { command = "ts-node --esm prisma/seed.ts" } - 确保你的
tsconfig.json配置正确(适配ES模块):{ "compilerOptions": { "module": "NodeNext", "moduleResolution": "NodeNext", "target": "ES2020", "esModuleInterop": true } } - 运行
npx prisma db seed
方案三:先编译TS为JS再运行(最稳妥,无ts-node兼容性问题)
如果上面的方案都不行,可以绕过ts-node,先编译TS文件:
- 在
package.json中添加一个编译seed的脚本:"scripts": { "seed:build": "tsc prisma/seed.ts --out-dir prisma/dist", "seed": "node prisma/dist/seed.js" } - 修改
prisma/schema.prisma中的seed命令:seed dev { command = "npm run seed:build && npm run seed" } - 运行
npx prisma db seed
内容的提问来源于stack exchange,提问作者mxcdh
相关产品推荐
相关产品推荐

