【问题标题】:Sequelize.or returns Limit 1 rather than or resultSequelize.or 返回 Limit 1 而不是 or 结果
【发布时间】:2017-05-03 09:59:43
【问题描述】:

我正在使用带有 Passportjs 的 SequelizeJS(MySql) 进行身份验证 当我写的时候

User.find(db.Sequelize.or({ 'username': username }, { 'email': req.body.email }) )
            .then((user) => {console.log(user)}

User.find({$or:[({ 'username': username }, { 'email': req.body.email })]} )

生成器

正在执行(默认):SELECT id, name, username, email, password, Picture, role, Description, joinedAt, @987654 987654333@, updatedAt FROM Users AS User LIMIT 1;

我不明白发生了什么,我正在使用 or 并生成限制为 1 的查询!

我的用户模型

const bcrypt = require('bcrypt-node');
const db = require('../Config/db');

module.exports = function () {
    let DataType = db.Sequelize;
    let User = db.sequelize.define('User', {
        name: { type: DataType.STRING, allowNull: false },
        username: { type: DataType.STRING, unique: true, allowNull: false },
        email: { type: DataType.STRING, unique: true, allowNull: false, validate: { isEmail: true } },
        password: {
            type: DataType.STRING, allowNull: false, set: function (pass) {
                let newPassword = bcrypt.hashSync(pass);
                this.setDataValue('password', newPassword);
            }
        },
        Picture: { type: DataType.STRING, default: '#' },
        role: { type: DataType.STRING, default: 'user',allowNull: false },
        Description: { type: DataType.TEXT },
        joinedAt: { type: DataType.DATE, defaultValue: DataType.NOW },
        Social: { type: DataType.TEXT }
    }, {
            classMethods: {
                associate: function (models) {
                    User.hasMany(models.Post);
                }
            }
        }, {
            instanceMethods: {
                comparePassword: function (password) {
                    return bcrypt.compareSync(password, this.password);
                }
            }
        });

    return User;
}

【问题讨论】:

    标签: javascript node.js express passport.js sequelize.js


    【解决方案1】:

    Sequelize 中没有函数Model.find(),所以看起来您可能正在调用Model.findOne(),它将LIMIT 1 应用于您的查询。要查找所有结果,您需要使用Model.findAll()

    您应该使用query operator $or,但它需要位于带有 OR 值数组的 where 元素内。请参阅下面的示例。

    User.findAll({
      where: {
        $or: [
          username: username,
          email: req.body.email,
        ],
      }
    })
    .then(users => console.log(users));
    

    【讨论】:

    • findfindOne 的别名,但现在可以与 where 一起使用 谢谢,问题文档没有提供任何此类示例。
    • 它必须是动态生成的,你说得对,它不在文档中,我也没有通过静态分析看到它。我建议坚持使用官方文档中的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多