Sequelize使用uuid_generate_v4设置默认值报语法错误如何解决?
Sequelize配置uuid默认值报错问题及解决方案
问题场景
在PostgreSQL数据库中使用Sequelize ORM配置模型字段的uuid默认值,已完成以下前置操作:
- 已启用
uuid-ossp扩展,通过数据库执行SELECT语句验证扩展安装正常,可正常调用uuid_generate_v4()函数 - 按照规范编写模型字段定义:
public_id: { field: 'public_id', type: Sequelize.UUID, allowNull: false, defaultValue: Sequelize.literal('uuid_generate_v4()'), },
报错信息
同步模型与数据库创建表时,Sequelize抛出如下错误:
Error: Invalid value Literal { val: 'uuid_generate_v4()' }
调试Sequelize源码后定位到报错点在sql_string.js的如下位置:
if (!val.replace) { throw new Error(`Invalid value ${logger.inspect(val)}`); }
报错触发逻辑为:传入的val不存在replace方法,无论literal方法传入参数内容是什么,都会触发相同报错。
根本原因
前文给出的模型定义代码完全正确,报错由项目自身依赖问题导致:
项目结构复杂度较高,模型定义阶段和调用Sequelize.define方法阶段,分别引入了两个不同文件夹下安装的Sequelize依赖包。
Sequelize底层对Sequelize.literal生成的Literal实例做了instanceof判断,由于实例来自不同的依赖包,判断返回假值,Literal实例没有被正确识别,被当作普通值处理触发了后续报错。
解决方案
清理项目中重复的Sequelize依赖文件夹,保证模型定义和模型注册环节使用同一个Sequelize依赖包即可解决问题。
内容的提问来源于stack exchange,提问作者partnerd
相关产品推荐
相关产品推荐

