在node.js中的mongoose用户上使用_.omit

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集合,这将使得哈希泄漏哈希极不可能,即使是偶然的,但任何一个以上将有效.