You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:06:25