使用Sequelize.js标记或检查字段

在Sequelize模型中是否有一种很好的方式来“标记”或“审查”一组属性?

我的意思是类似nodejs-model支持的标记。

例如,我的用户架构有一个密码字段。 我不希望这从任何API调用返回。 我也不想在用户控制器中审查这个,因为在每个路由的基础上configuration审查器似乎是不好的做法。

我很想能够做一些像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() ) }) }) 

这不会阻止你回复敏感数据,但使所有的路线使用相同的卫生方法将有所帮助。