Node.js 使用Sequelize.js标记或审查字段
在Sequelize模型中,是否有一种“标记”或“审查”属性集的好方法 我的意思是类似于支持的标记 例如,我的用户模式有一个密码字段。我不想从任何API调用中返回这个。我也不想在用户控制器中对其进行审查,因为在每个路由的基础上配置审查似乎是一种不好的做法Node.js 使用Sequelize.js标记或审查字段,node.js,sequelize.js,Node.js,Sequelize.js,在Sequelize模型中,是否有一种“标记”或“审查”属性集的好方法 我的意思是类似于支持的标记 例如,我的用户模式有一个密码字段。我不想从任何API调用中返回这个。我也不想在用户控制器中对其进行审查,因为在每个路由的基础上配置审查似乎是一种不好的做法 我希望能够像User.find({query},{tag:'public')我通常定义自己的助手方法来限制sequelize返回的数据 var User = connection.define( 'User', { email: Seque
我希望能够像
User.find({query},{tag:'public')
我通常定义自己的助手方法来限制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 )
}
})
请注意,这两种方法都允许通过user.getDataValue('password')
访问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() )
})
})
这不会阻止你返回敏感数据,但让你的所有路线使用相同的卫生方法会有所帮助。感谢你的指导。我希望有一个比包装sequelize find函数来删除敏感字段更优雅的通用解决方案。不过,你的评论确实有帮助。我可能不会请尝试编写一个mixin来包装所有返回sequelize模型实例的函数,并删除敏感字段,除非找到正确的标记。