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
相关产品推荐
相关产品推荐

