epe*_*leg 3 mongoose node.js underscore.js
我有一个像这样构建的mongoose User模式:
var UserSchema = new Schema({
username: { type: String, required: true, index: { unique: true } },
password: { type: String, required: true },
salt: { type: String, required: true}
});
Run Code Online (Sandbox Code Playgroud)
我希望能够将此用户对象发送到我的应用程序的客户端,但我不想要密码或盐字段.
所以我在他的用户模型模块中添加了以下代码
ü
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;
}
Run Code Online (Sandbox Code Playgroud)
我有required下划线模块(它通过我的package.js中的依赖项本地安装).
不是注释掉的行 - 我希望它省略用户对象的密码和salt字段,但它没有做任何事情:(记录的对象具有完整的属性集.
当用当前使用的替换时var userForClientSide={_id:this._id, username:this.username };它会得到我想要的结果但是:
1)我想知道为什么不起作用_.omit.2)我不太喜欢我当前的解决方法,因为它实际上选择了一些属性而不是省略我不喜欢的属性,所以如果我要在scema中添加任何新属性我也必须在这里添加它们.
这是我第一次尝试使用node.js/express/mongodb/mongoose等编写内容.所以很可能我错过了一些其他更好的解决方案来解决这个问题(可能是猫鼬的一些功能)随时教我的这样做的正确方法.
所以基本上我想知道什么是正确的方法,为什么我的方式不起作用.
谢谢
Pet*_*ons 11
1)我想知道为什么_.omit不起作用.
猫鼬使用defineProperty和一些重的元编程.如果你想使用下划线,首先调用user.toJSON()以获得一个普通的旧javascript对象,它可以更好地使用下划线,而不需要所有的元编程功能,功能等.
一个更好的解决方案是使用mongo/mongoose的fields对象并传递字符串"-password -salt",因此根本不要从mongo中取回它们.
另一种方法是使用mongoose Transform(在该页面上搜索"tranform").您的用例是文档使用的EXACT用例作为示例.
您还可以通过调用查询来使您的mongoose查询"精益" .lean(),在这种情况下,您将返回普通的javascript对象而不是mongoose模型实例.
然而,在尝试了这些内容之后,我个人认为应该有一个单独的集合,Account其中包含登录详细信息和User集合,这将使得哈希泄漏哈希极不可能,即使是偶然的,但任何一个以上将有效.
| 归档时间: |
|
| 查看次数: |
1609 次 |
| 最近记录: |