sequelize findAll时提示 Invalid value

如果不使用$like查询是没问题的,但是业务需要模糊搜索功能。
一旦使用$likeInvalid value

连接数据库

var sequelize = new Sequelize('data', 'root', 'Root123', {
  host: 'localhost',
  dialect: 'mysql',
  dialectOptions: {
    charset: 'utf8mb4'
  },
  pool: {
    max: 5, // 连接池中最大连接数量
    min: 0, // 连接池中最小连接数量
    idle: 10000 // 如果一个线程 10 秒钟内没有被使用过的话,那么就释放线程
  },
  operatorsAliases: false,
});

定义模型

var patient = sequelize.define('patient', {
  user: Sequelize.TEXT,
  sex: Sequelize.STRING,
  age: Sequelize.INTEGER,
  num: Sequelize.INTEGER,
  bed: Sequelize.INTEGER,
  department: Sequelize.STRING,
}, {
  // 不加会导致出现复数users未找到的错误
  freezeTableName: true,
  timestamps: false
});
patient.removeAttribute('id')
patient.removeAttribute('createdAt')
patient.removeAttribute('updatedAt')

查询

router.post("/searchPatient", function (req, res, next) {
  console.log(req.body.val)
  patient.findAll({
    where: {
      num: {
        $gte: 4
      }
      /* $or: [{
          user: req.body.val
        },
        {
          num: req.body.val
        }
      ] */
    }
  }).then(function (doc) {
    if (doc.length != 0) {
      console.log(doc)
    } else {
        // ...
    }
  }).catch(function (err) {
    console.log('错误' + err)
  })
});

提示错误Error: Invalid value { '$gte': 4 }

阅读 9.8k
3 个回答

中文文档看漏了,现在用const Op = Sequelize.Op;[Op.or]: [{}]去筛选。。

其实你使用原来的 $like 也是可以的。在Sequelize中 称为操作符的别名,但是在V4版本以后新加了符号运算符来代替了,比如你说的Op.or , operatorsAliases: false, 这个配置改成true,就不会报错了。

具体信息查看链接 , 查看运算符安全性部分。

新手上路,请多包涵

模糊搜索可以用这个
const Op = Sequelize.Op;
patient.findAll({

where: {
  num: {
    [Op.like]: `%${name}%`
  }
  
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进