使用Sequelize.js标记或删除字段

时间:2015-04-21 02:30:32

标签: node.js sequelize.js

在Sequelize模型中是否有一种“标记”或“审查”属性集的好方法?

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

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

我希望能够做User.find({query}, {tag: 'public')

之类的事情

1 个答案:

答案 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() )
  })
})

这不会阻止您从永远返回敏感数据,但让所有路线都使用相同的卫生方法会有所帮助。