以下是代码:
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。我当然可以从对象中删除这些属性,但我正在寻找一种更简单的方法。
答案 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);
}
});