MikroORM与TypeScript开发中ESM模块加载错误求助
解决MikroORM对接PostgreSQL的ESM编译错误
核心问题分析
你的错误源于Node.js默认将文件视为CommonJS模块,但TypeScript配置已启用ES模块(ESNext),却未明确告知Node.js项目整体采用ESM规范,同时MikroORM CLI和代码中的路径处理也未适配ESM环境。
分步解决方案
1. 标记项目为ESM模块
在项目根目录的package.json中添加"type": "module"字段,让Node.js将所有.js/.ts文件当作ES模块处理:
{ "type": "module", // 保留原有scripts、dependencies等字段 }
2. 修复MikroORM配置的路径问题
ESM环境中不存在__dirname/__filename全局变量,需通过import.meta.url手动生成。修改mikro-orm.config.ts:
import { __prod__ } from "./constants"; import { MikroORM } from "@mikro-orm/core"; import { Post } from "./entities/Post"; import path from "path"; import { fileURLToPath } from 'url'; import { dirname } from 'path'; // 生成ESM环境下的目录路径 const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); export default { migrations: { path: path.join(__dirname, "./migrations"), pattern: /^[\w]+\d+\.[tj]$/, }, entities: [Post], dbName:"fakereddit", type:"postgresql", debug:!__prod__, } as Parameters<typeof MikroORM.init>[0];
3. 适配MikroORM CLI的ESM模式
修改package.json中的迁移脚本,指定CLI使用ts-node的ESM加载器:
"scripts": { "dev": "ts-node src/index.ts", "migrate:create": "mikro-orm migration:create --require ts-node/register/esm", "migrate:run": "mikro-orm migration:run --require ts-node/register/esm" }
4. 确认tsconfig配置有效性
确保tsconfig.json中以下配置无误:
"module": "ESNext"(已配置)"moduleResolution": "node"或"bundler"(Node.js 18+推荐"bundler","node"也兼容)"ts-node": { "esm": true }(已配置)
完成以上步骤后,重新运行yarn dev和迁移命令,ESM相关错误即可解决。
内容的提问来源于stack exchange,提问作者Itay Haim
相关产品推荐
相关产品推荐

