Sequelize findOrCreate不排除exclude数组中定义的属性

时间:2017-02-12 11:28:59

标签: mysql sequelize.js

以下是代码:

Accounts.findOrCreate({
    where: {
        userName: request.payload.userName
    },
    attributes: { exclude: ['password','sessionToken'] },
    defaults: request.payload
}).spread(function (account, created) {

    if (created) {
        var account = account.get({
            plain: true
        });

        console.log(account);   // has the password and sessionToken fields

        return reply(account).code(201);
    } else {
        return reply("user name already exists").code(422);
    }

});

我注意到sequelize首先触发一个不存在密码字段的select查询,然后它会触发一个插入语句,其中存在密码字段,并且需要在那里。

我只想在生成的帐户对象中不存在密码和sessionToken。我当然可以从对象中删除这些属性,但我正在寻找一种更简单的方法。

2 个答案:

答案 0 :(得分:2)

您似乎需要手动删除这些字段。根据源代码,findOrCreate方法首先触发findOne函数,然后如果找不到实例,它将与create一起使用。 create方法不接受attributes参数。在这种情况下,将返回所有字段。

好的解决方案是在Accounts模型中创建实例方法,以便返回仅包含所需属性的实例。

{
    instanceMethods: {
        toJson: function() {
            let account = {
                id: this.get('id'),
                userName: this.get('userName')
                // and other fields you want to include
            };

            return account;
        }
    }
}

然后,您可以在返回对象的原始表示时简单地使用toJson方法:

Accounts.findOrCreate({ where: { userName: 'username' } }).spread((account, created) => {
    return account ? account.toJson() : null;
});

答案 1 :(得分:1)

如piotrbienias所述,您可以按照他的方式,否则只需删除不需要的元素:

Accounts.findOrCreate({
    where: {
        userName: request.payload.userName
    },
    defaults: request.payload
}).spread(function (account, created) {

    if (created) {
        var account = account.get({
            plain: true
        });
        delete account.password;
        delete account.sessionToken;
        console.log(account);   // now you don't have the password and sessionToken fields

        return reply(account).code(201);
    } else {
        return reply("user name already exists").code(422);
    }

});