Sequelizejs findAll exclude field

时间:2015-07-28 14:50:11

标签: node.js sequelize.js

我知道options.attributes您列出了要选择的属性 但有没有办法只排除一个字段?

到现在为止我用

解决了这个问题
User
  .findAll({order: [['id','DESC']]})
  .then(function(users) {
    users = users.filter(function(user){
      delete user.dataValues.password;
      return user;
    });
    return reply( ReplyUtil.ok(users) );
  })
  .catch(function(err){
    return reply( ReplyUtil.badImplementation(err) );
  });

顺便说一句

我不明白为什么你应该使用user.dataValues.password 如果不是删除不起作用而不仅仅是user.password 如果我这样调试console.log('pass: ', user.password)我可以看到密码。

2 个答案:

答案 0 :(得分:1)

我知道这是旧帖子。但是由于同样的问题,我来到这里,我相信会有更多的人来。因此,在研究了stackoverflow中的一些帖子之后,我发现最简单的方法是使用select函数来指定我们不想返回的字段。所以它的功能看起来像这样:

User
  .findAll({order: [['id','DESC']]}).select('-password')
  .then(function(users) {
    return reply( ReplyUtil.ok(users) );
  })
  .catch(function(err){
    return reply( ReplyUtil.badImplementation(err) );
  });

另一种方法是更改​​模型(通过代码,我假设您使用猫鼬或续集指定了此模型)。您可以这样指定字段:password: { type: String, select: false }。默认情况下,此选择将​​导致数据库中的任何查询都不会返回密码。除非您使用上一个功能在查询(select ('+ password'))中添加密码。

AND

要回答您的主要问题,Mongoose和Sequelize将其所有返回值包装在包含元数据的虚拟对象中。如果你有一个对象,你只想无装饰,你必须拆开包装他们,这样的:

Model.findById(1).then(data => {
  console.log(data.get({ plain: true }));
});

如果只想打印对象,则可以使用.toJSON:

Model.findById(1).then(data => {
  console.log(data.toJSON);
});

如果只需要数据而不是模型实例,则可以执行以下操作:

Model.findAll({
  raw: true
});

答案 1 :(得分:0)

是的,可以排除字段,就像这样:

User
  .findAll({
    exclude: ['password']
    order: [['id','DESC']]})
  .then( users => {
    return reply( ReplyUtil.ok(users) );
  })
  .catch( err => {
    return reply( ReplyUtil.badImplementation(err) );
  });

有关更多详细信息,请参见https://sequelize.org/master/manual/querying.html