gpt4 book ai didi

node.js - 在 node.js 中对 Mongoose 用户使用 _.omit

转载 作者:搜寻专家 更新时间:2023-10-31 23:29:43 26 4
gpt4 key购买 nike

我有一个像这样构建的 Mongoose 用户模式:

var UserSchema = new Schema({
username: { type: String, required: true, index: { unique: true } },
password: { type: String, required: true },
salt: { type: String, required: true}
});

我希望能够将此用户对象发送到我的应用程序的客户端,但我不想发送密码或加盐字段。

所以我将以下代码添加到我的用户模型模块

serSchema.methods.forClientSide = function() {
console.log('in UserSchema.methods.forClientSide');
console.log(this);
//var userForClientSide=_.omit(this,'passsword','salt');
var userForClientSide={_id:this._id, username:this.username };
console.log(userForClientSide);

return userForClientSide;
}

需要下划线模块(它通过我的 package.js 中的依赖项在本地安装)。

不是注释掉的那一行——我原以为它会省略用户对象的密码和盐字段,但它什么也没做:(记录的对象具有完整的属性集。

当替换为当前使用的 var userForClientSide={_id:this._id, username:this.username }; 它得到我想要的结果但是:

1) 我想知道为什么 _.omit 不起作用。2) 我不太喜欢我当前的解决方法,因为它实际上选择了一些属性而不是省略了我不喜欢的属性,所以如果我要向 scema 添加任何新属性,我也必须在此处添加它们。

这是我第一次尝试使用 node.js/express/mongodb/mongoose 等编写一些东西。所以我很可能错过了一些其他更好的解决这个问题的方法(可能是 mongoose 的一些特性)随时教育我知道做这样的事情的正确方法。

所以基本上我想知道执行此操作的正确方法是什么以及为什么我的方法不起作用。

谢谢

最佳答案

1) I want to know why does the _.omit not work.

Mongoose 使用 defineProperty 和一些繁重的元编程。如果你想使用下划线,首先调用 user.toJSON() 来获得一个普通的旧 javascript 对象,它可以更好地使用下划线,而不需要所有的元编程幻想、函数等。

更好的解决方案是使用 mongo/mongoose 的 fields 对象并传递字符串 "-password -salt",因此完全忽略从 mongo 取回这些内容。

另一种方法是使用 Mongoose Transform (在该页面上搜索“转换”)。您的用例是文档用作示例的确切用例。

您还可以通过在查询中调用 .lean() 使您的 mongoose 查询“精简”,在这种情况下,您将返回纯 javascript 对象而不是 mongoose 模型实例。

但是,在尝试了所有这些之后,我个人认为应该为 Account 提供一个单独的集合,其中包含登录详细信息和一个 User collection,即使是意外泄露哈希值的可能性也很小,但以上任何一种方法都可以。

关于node.js - 在 node.js 中对 Mongoose 用户使用 _.omit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17980461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com