使用Sequelize.not查询时出现value为undefined报错如何解决
问题解决方案
你遇到的报错核心有两个常见原因:
- 新版Sequelize(v6+)已废弃直接挂载在sequelize实例上的运算符,所有比较运算符需要从
Op对象中引入,你直接使用[sequelize.not]时该值为undefined,所以生成的查询条件会变成{ undefined: '0' },触发Invalid value报错。 - 你的
messageID字段为nchar(20)定长字符类型,存储单字符'0'时会自动补全19个尾部空格,直接等值匹配也会导致结果不符合预期。
正确实现步骤
1. 引入Op运算符
在代码头部导入运算符对象:
const { Op } = require('sequelize'); // TypeScript 写法:import { Op } from 'sequelize';
2. 修改查询条件写法
有两种合法的不等于查询写法,同时可以配合TRIM函数处理定长字符的空格问题:
写法1:使用Op.ne(不等于运算符,更直观)
let total = await userDB.tblSMSSent.findOne({ attributes: [[sequelize.fn('COUNT', 'id'), 'numMessages']], where: { user: userName, [Op.and]: sequelize.where( sequelize.fn('TRIM', sequelize.col('messageID')), { [Op.ne]: '0' } ) }, logging: false })
写法2:使用Op.not实现相同逻辑
let total = await userDB.tblSMSSent.findOne({ attributes: [[sequelize.fn('COUNT', 'id'), 'numMessages']], where: { user: userName, [Op.and]: sequelize.where( sequelize.fn('TRIM', sequelize.col('messageID')), { [Op.not]: '0' } ) }, logging: false })
如果确认数据库内的'0'没有尾部空格,也可以简化为普通字段匹配:
where: { user: userName, messageID: { [Op.ne]: '0' } }
内容的提问来源于stack exchange,提问作者Geoff
相关产品推荐
相关产品推荐

