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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:09:02