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

Sequelize报错Invalid value { username: { '$eq': 'admin' } }求助

解决Sequelize findAll查询中"Invalid value { username: { '$eq': 'admin' } }"错误

错误原因

这个错误是Sequelize版本差异导致的操作符写法不兼容:

  • Sequelize v5及以上版本已废弃$eq这类字符串前缀的操作符,必须使用Op(Operators)对象中的属性定义查询条件
  • 若无意间使用旧版写法,或未正确导入Op对象,就会触发该错误

具体解决方案

1. 导入Op操作符对象

在你的路由文件(user.js)顶部,确保导入Sequelize的Op:

const { Op } = require('sequelize');
// 若通过实例化的sequelize对象引入,写法为:
// const { Op } = require('./database/index.js'); // 根据实际文件路径调整

2. 修正登录查询逻辑

将原查询中$eq的写法替换为[Op.eq],或直接传入值(eq是默认匹配规则,可省略显式声明):

支持用户名/邮箱登录的修正代码示例:

// 假设你的用户模型为User
const user = await User.findAll({
  where: {
    [Op.or]: [
      { username: req.body.usernameOrEmail }, // 直接匹配,默认使用eq规则
      { email: req.body.usernameOrEmail }
    ]
  }
});

// 若需显式声明eq规则,写法如下:
// const user = await User.findAll({
//   where: {
//     [Op.or]: [
//       { username: { [Op.eq]: req.body.usernameOrEmail } },
//       { email: { [Op.eq]: req.body.usernameOrEmail } }
//     ]
//   }
// });

3. (不推荐)开启操作符别名以兼容旧写法

若因特殊需求必须保留$eq这类写法,可在database配置(index.js)中开启操作符别名,但官方不推荐此方式,存在安全风险:

const sequelize = new Sequelize(database, username, password, {
  // 其他配置项...
  operatorsAliases: {
    $eq: Op.eq,
    $or: Op.or
    // 按需添加其他需要兼容的操作符
  }
});

验证修改

重启后端服务后重新调用登录接口,此时应能正常匹配用户名/邮箱,不再抛出Invalid value错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:43:13