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
相关产品推荐
相关产品推荐

