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

NestJS使用migrate-mongo遇问题:TS文件不兼容、需配置type:module等

NestJS + migrate-mongo 问题解决方案

背景信息

我正在开发NestJS应用,使用migrate-mongo工具,通过npx migrate-mongo -m esm init完成初始化,且在package.json中添加了"type": "module",配置文件migrate-mongo-config.js内容如下:

const config = {
  mongodb: {
    url: 'mongodb://localhost:27017/persomic',
    options: {
      useNewUrlParser: true, // 移除连接时的弃用警告
      useUnifiedTopology: true, // 移除连接时的弃用警告
    },
  },
  migrationsDir: 'migrations',
  changelogCollectionName: 'changelog',
  migrationFileExtension: '.js',
  useFileHash: true,
  moduleSystem: 'esm',
};
export default config;

已知migrate-mongo 10.0.0+支持TS文件,但将migrationFileExtension设为.ts时,迁移文件(代码为export const up = async (db, client) => { }; export const down = async (db, client) => { };)会报错Unexpected token export;设为.js时可正常创建迁移文件,但执行up命令异常。当前面临三类问题,对应解决方案如下:


1. 无法使用TS格式迁移文件

migrate-mongo本身不会自动编译TS,需借助ts-node处理:

  • 修改migrate-mongo-config.js中的migrationFileExtension为.ts,moduleSystem设为commonjs(若坚持ESM需额外配置TS兼容)
  • 在package.json中添加迁移脚本,用ts-node执行migrate-mongo:
    "scripts": {
      "migrate:create": "ts-node node_modules/migrate-mongo/bin/migrate-mongo.js create <迁移名称>",
      "migrate:up": "ts-node node_modules/migrate-mongo/bin/migrate-mongo.js up",
      "migrate:down": "ts-node node_modules/migrate-mongo/bin/migrate-mongo.js down"
    }
    
  • 确保项目根目录有正确配置的tsconfig.json,示例:
    {
      "compilerOptions": {
        "module": "CommonJS",
        "target": "ES6",
        "esModuleInterop": true,
        "skipLibCheck": true,
        "strict": false
      },
      "include": ["migrations/**/*.ts"]
    }
    
  • 迁移文件可使用CommonJS导出格式(module.exports = { up, down }),或保持ESM导出并确保ts-node与migrate-mongo的ESM兼容。

2. 移除package.json中type:module的替代方案

无需全局启用ESM,仅针对migrate-mongo单独配置:

  • 将migrate-mongo-config.js重命名为migrate-mongo-config.cjs,修改为CommonJS格式:
    module.exports = {
      mongodb: {
        url: 'mongodb://localhost:27017/persomic',
        options: {
          useNewUrlParser: true,
          useUnifiedTopology: true,
        },
      },
      migrationsDir: 'migrations',
      changelogCollectionName: 'changelog',
      migrationFileExtension: '.js',
      useFileHash: true,
      moduleSystem: 'commonjs',
    };
    
  • 执行migrate-mongo命令时指定配置文件:
    npx migrate-mongo -c migrate-mongo-config.cjs up
    
  • 此时可安全移除package.json中的"type": "module",避免影响项目中其他CommonJS模块。

3. MongoDB中未创建migrations集合,但changelog集合已生成

migrate-mongo默认使用changelog集合存储迁移历史,这是正常行为。若需使用migrations作为集合名:

  • 修改migrate-mongo-config.cjs(或.js)中的changelogCollectionName为'migrations'
  • 再次执行迁移命令时,工具会自动创建migrations集合并记录迁移日志。

内容的提问来源于stack exchange,提问作者tahsin zilani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:32:40