在Sequelize模型中是否有一种“标记”或“审查”属性集的好方法?
我的意思是像nodejs-model支持的标记。
例如,我的用户架构有一个密码字段。我不希望从任何API调用返回此消息。我也不想在用户控制器中对此进行审查,因为在每个路由的基础上配置审查似乎是不好的做法。
我希望能够做User.find({query}, {tag: 'public')
答案 0 :(得分:1)
我通常定义自己的辅助方法来限制sequelize返回的数据。
var User = connection.define( 'User', {
email: Sequelize.VARCHAR( 255 ),
password: Sequelize.VARCHAR( 255 ), //note: do NOT store plaintext passwords
}, {
instanceMethods: {
sanitize: function(){
var data = this.get()
delete data.password
return data
}
},
classMethods: {
get: function( options ){
return this.find( options ).then( function( record ){
return record.sanitize()
})
},
getAll: function( options ){
return this.findAll( options ).then( function( records ){
return records.map( function( record ){
return record.sanitize()
})
})
}
}
})
如果您想要一般性地限制对字段的简单访问,这也是可行的:
var User = connection.define( 'User', {
email: Sequelize.VARCHAR( 255 ),
password: {
type: Sequelize.VARCHAR( 255 ), //note: do NOT store plaintext passwords
get: function(){
return null
},
set: function( value ){
this.setDataValue( 'password', value )
}
})
请注意,这两种方法都可以通过password
访问user.getDataValue( 'password' )
字段。
所以在你的控制器中,而不是使用这样的东西:
app.get( '/admin-user', function( req, res ){
User.find( 1 ).then( function( user ){
res.json( user.get() )
})
})
使用此
app.get( '/admin-user', function( req, res ){
User.get( 1 ).then( function( user ){
res.json( user )
})
})
或者
app.get( '/admin-user', function( req, res ){
User.find( 1 ).then( function( user ){
res.json( user.sanitize() )
})
})
这不会阻止您从永远返回敏感数据,但让所有路线都使用相同的卫生方法会有所帮助。