我正在使用Sequelize为用户记录执行数据库查找,我希望模型的默认行为 not 返回该记录的 password
字段 . password
字段是一个哈希,但我仍然不想返回它 .
我有几个选项可以使用,但似乎没有一个特别好:
-
为
User
模型创建自定义类方法findWithoutPassword
,并在该方法中执行User.find
并设置attributes
,如Sequelize docs所示 -
执行正常
User.find
并过滤控制器中的结果(不是首选) -
使用其他库来去除不需要的属性
有没有更好的办法?最重要的是如果有一种方法可以在Sequelize模型定义中指定永远不会返回 password
字段,但我还没有找到方法来做到这一点 .
5 回答
另一种方法是向User模型添加默认范围 .
在模型的选项对象中添加它
或者,您可以创建单独的范围,仅在某些查询中使用它 .
在模型的选项对象中添加它
然后,您可以在查询中使用它
也许你可以在
find
时在你的属性上添加exclude
,如下所示:阅读docs了解更多详情
我喜欢结合使用Pawan的两个答案,并声明如下:
这允许我默认排除密码,并在需要时使用
withPassword
范围显式返回密码,例如在运行登录方法时 .这确保了在通过引用字段包括用户时不返回密码,例如,
有scoping attributes的插件,正如here所讨论的那样 .
我接受了在接受的答案中提到的覆盖,除了我调用原始的
toJSON
而不是get
与this.constructor.super_.prototype.toJSON.apply(this, arguments)
,如api docs所述我建议覆盖
toJSON
函数:或者在sequelize v4中
数据返回给用户时会调用
toJSON
,因此最终用户将看不到密码字段,但代码中仍会显示该密码字段 .Object.assign
克隆返回的对象 - 否则您将从实例中完全删除该属性 .