Next.js13+TypeORM0.3使用glob模式导入实体报错求助
解决TypeORM在Next.js 13中使用Glob模式导入实体的SyntaxError问题
核心问题分析
你遇到的SyntaxError: Cannot use import statement outside a module错误,本质是Next.js 13的ES模块环境与TypeORM实体路径解析、模块加载规则不匹配导致的,另外代码里存在明显笔误:proccess应该是process,这也会影响路径解析。
具体解决方案
1. 修正代码笔误
先把所有proccess.cwd()改为process.cwd(),拼写错误会导致路径无法正确生成。
2. 配置package.json的模块类型
确保package.json中包含"type": "module",让Node.js默认按ES模块处理文件:
{ "type": "module" }
3. 调整实体路径的ES模块兼容写法
Next.js 13使用ES模块,传统的__dirname和path.join(process.cwd())无法直接使用,需要用fileURLToPath和dirname手动获取文件路径,同时根据环境区分实体文件后缀(开发用.ts,生产用编译后的.js):
import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import { DataSource } from 'typeorm'; import env from './env'; // ES模块环境下获取当前文件目录 const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const IS_PRODUCTION = process.env.NODE_ENV === 'production'; const dataSource = new DataSource({ url: env.DB_DSN, type: 'postgres', synchronize: false, logging: IS_PRODUCTION ? undefined : ['query'], // 根据环境选择实体文件后缀 entities: [join(__dirname, IS_PRODUCTION ? '../**/*Entity.js' : '../**/*Entity.ts')], logNotifications: true, });
4. 调整tsconfig.json配置
确保tsconfig.json的模块解析配置与ES模块兼容:
{ "compilerOptions": { "module": "ESNext", "moduleResolution": "node", "allowSyntheticDefaultImports": true, "esModuleInterop": true } }
5. 备选方案:直接导入实体(规避Glob模式问题)
如果Glob模式仍无法正常工作,可以放弃Glob,直接手动导入所有实体类,这种方式更稳定,也避免了路径解析问题:
import UserEntity from './entities/UserEntity'; import PostEntity from './entities/PostEntity'; const dataSource = new DataSource({ url: env.DB_DSN, type: 'postgres', synchronize: false, logging: IS_PRODUCTION ? undefined : ['query'], entities: [UserEntity, PostEntity], logNotifications: true, });
内容的提问来源于stack exchange,提问作者Cursed
相关产品推荐
相关产品推荐

