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

使用db-migrate+@babel/register与ES6模块时遇Unexpected token export错误求助

解决db-migrate导入本地工作包时的ES模块语法错误问题

我完全懂你遇到这个问题的崩溃感——明明依赖装得好好的,执行迁移命令却卡在语法错误上,太闹心了!咱们一步步来排查解决:

问题根源

你使用的Node v12.4.0对ES模块(export语法)的原生支持还不完善,而且db-migrate的babel插件默认只转译migrations目录下的文件,没有处理你导入的本地工作区包@mypackage/models,导致Node直接读取了未转译的ES语法代码,抛出了SyntaxError。

解决方案

方案1:让Babel覆盖转译本地工作区包

把根目录的.babelrc替换成babel.config.js(因为.babelrc是局部配置,不会处理工作区的其他包),并明确指定要转译的路径:

module.exports = {
  presets: ['@babel/preset-env'],
  include: [
    './migrations/**/*',
    './common/models/**/*' // 加上你的模型源码路径
  ]
};

同时检查你的database.json(db-migrate的配置文件),确保已经启用了babel插件:

{
  "dev": {
    "driver": "mysql",
    // ...你的数据库连接配置
    "plugins": ["db-migrate-plugin-babel"]
  }
}

方案2:把模型文件改成CommonJS格式(最省心)

既然Node v12对CommonJS支持更稳定,直接修改@mypackage/models里的文件,替换ES导出语法:

var CONSTANT_ONE = "foo_one";
var CONSTANT_TWO = "foo_two";
var CONSTANT_THREE = "foo_three";
// 替换export为CommonJS的导出方式
module.exports = { CONSTANT_ONE, CONSTANT_TWO, CONSTANT_THREE };

这样不需要任何转译,Node就能直接识别,也能避开工作区转译的坑。

方案3:启用ES模块实验特性(不推荐)

如果坚持要用ES模块,可以在@mypackage/models的package.json里添加:

{
  "type": "module"
}

但Node v12需要加上--experimental-modules flag运行,而且db-migrate对实验性ES模块的支持可能不稳定,大概率会遇到其他问题,所以优先推荐前两个方案。

验证步骤

  1. 删掉node_modules和yarn.lock,重新执行yarn install
  2. 再尝试运行迁移命令:db-migrate down -c 1

应该就能顺利执行了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:43:35