我正在尝试在sails js中创建CRUD应用程序,并且我能够将数据发布到我的数据库,我注意到当我在成功帆上插入数据返回整个对象时。但如果我们不想要某些字段作为回应,那么我们如何限制它。请帮助谢谢。
module.exports = {
attributes : {
username : {
type: 'string',
required: true
},
password : {
type: 'string',
required: true
},
email : {
type: 'string',
required: true,
unique: true
}
},
toJson: function() {
var obj = this.toObject();
delete obj.password;
return obj;
},
beforeCreate: function(attribute, callback) {
console.log(attribute.password);
require('bcrypt').hash(attribute.password, 10, function(err, encryptedPassword) {
sails.log(err);
attribute.password = encryptedPassword;
sails.log(encryptedPassword);
callback();
});
}
};
答案 0 :(得分:1)
我认为通过sails默认REST模型的响应会在返回之前通过.toJSON
运行它们,因此您正在以正确的方式执行此操作。
但是,您可能遇到个案问题,例如您应该使用大写而不是.toJSON
定义.toJson
。尝试进行切换,看看它是否能解决您的问题。
更新
这听起来不是解决你的问题。来自here的风帆文档说:
toJSON的真正威力依赖于通过res.json发出的每个模型实例首先传递给JSON的事实。您可以通过简单地覆盖模型中的默认toJSON函数来操作传出记录,而不是为使用特定模型的每个控制器操作编写自定义代码(包括"开箱即用"蓝图)。您可以使用此方法将电子邮件地址和密码等私人数据发送回每个客户端。
这听起来非常像我们正在尝试做的事情,所以这可能是一个风帆错误。也许它适用于find
,但不适用于create
。简单地找到现有用户时是否返回了该密码?
如果必须,可以肯定的是覆盖UserController中的默认创建操作:
create: function(req, res) {
User.create(req.body).exec(function(err, user) {
if (err) {
return res.json(err);
}
// explicitly call your own toJSON() to be sure
return res.send(user.toJSON());
});
},
这不是理想的,特别是如果你想在许多api调用中隐藏许多模型属性。但它会完成工作。
答案 1 :(得分:1)
@arbuthnott上面部分正确 - 您确实需要toJSON
而非toJson
- 但更重要的是,该函数需要在attributes
词典中 ,因为它是一个实例方法:
attributes : {
username : {
type: 'string',
required: true
},
password : {
type: 'string',
required: true
},
email : {
type: 'string',
required: true,
unique: true
},
toJSON: function() {
var obj = this.toObject();
delete obj.password;
return obj;
}
}
答案 2 :(得分:1)
密码:{类型:“字符串”,必填:true,受保护:true}
protected:true
现在在Sails v1.0中已弃用
您可以使用customToJSON
代替customToJSON: function() {
// Return a shallow copy of this record with the password and ssn removed.
return _.omit(this, ['password', 'ssn'])
}
答案 3 :(得分:0)
password: { type: 'string', required: true, protected: true }
你也可以这样做。