Node Express+Mybatis-Mapper在Ubuntu服务器正则表达式报错求助
解决Node Express + mybatis-mapper部署Ubuntu时的正则转义报错问题
问题现象
本地Windows+VS Code环境下,Node Express结合mybatis-mapper搭建的网页运行正常,但部署到Ubuntu服务器后出现以下报错:
SyntaxError: Invalid regular expression: /^([\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]+)/: Invalid escape at new RegExp (<anonymous>) at Object.createWordRegex (/home/minieyes85/node_modules/sql-formatter/lib/core/regexFactory.js:38:10) at new Tokenizer (/home/minieyes85/node_modules/sql-formatter/lib/core/Tokenizer.js:74:36) at StandardSqlFormatter.tokenizer (/home/minieyes85/node_modules/sql-formatter/lib/languages/StandardSqlFormatter.js:57:14) at StandardSqlFormatter.format (/home/minieyes85/node_modules/sql-formatter/lib/core/Formatter.js:87:26) at Object.format (/home/minieyes85/node_modules/sql-formatter/lib/sqlFormatter.js:74:29) at MybatisMapper.getStatement (/home/minieyes85/node_modules/mybatis-mapper/index.js:109:32) at router.get (/home/minieyes85/routes/main.js:51:28) at Layer.handle [as handle_request] (/home/minieyes85/node_modules/express/lib/router/layer.js:95:5) at next (/home/minieyes85/node_modules/express/lib/router/route.js:144:13)
原因分析
该报错与XML编码无关,核心原因是Node.js版本对Unicode属性转义语法的支持差异:
- 本地Windows环境使用的Node.js版本较高,支持ES2018引入的
\p{...}Unicode属性转义正则语法; - Ubuntu服务器上的Node.js版本过低,不支持该语法,导致sql-formatter库中的正则表达式解析失败。
解决方案
方案1:升级Ubuntu服务器的Node.js版本
将Node.js升级到支持Unicode属性转义的版本(Node.js 10.0.0及以上,推荐使用LTS版本如16.x/18.x):
- 安装nvm(Node版本管理器):
(执行后重启终端使nvm生效)curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash - 安装并切换到最新LTS版本:
nvm install --lts nvm use --lts - 重启Node项目,验证报错是否消失。
方案2:降级sql-formatter到兼容低版本Node的版本
如果暂时无法升级Node.js,可手动指定兼容的sql-formatter版本:
- 卸载当前版本:
npm uninstall sql-formatter - 安装兼容的旧版本(如3.2.3,该版本未使用Unicode属性转义):
npm install sql-formatter@3.2.3 - 重启项目,检查问题是否解决。
方案3:禁用mybatis-mapper的SQL格式化功能
通过关闭mybatis-mapper的SQL格式化逻辑,绕过sql-formatter的调用:
在调用getStatement方法时,添加format: false参数,示例代码:
const statement = mybatisMapper.getStatement('namespace', 'sqlId', params, { format: false });
该方式无需修改Node版本或依赖库,直接跳过格式化步骤,避免触发正则报错。
内容的提问来源于stack exchange,提问作者J.S.Choi
相关产品推荐
相关产品推荐

