3

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

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;
}

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

不是注释掉的行-我希望它省略用户对象的密码和盐字段,但它没有做任何事情:(记录的对象具有完整的属性集。

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

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

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

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

谢谢

4

1 回答 1

12

1)我想知道为什么 _.omit 不起作用。

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

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

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

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

然而,在尝试了这些事情之后,我个人认为应该有一个单独的集合,Account其中包含登录详细信息和一个User集合,这将使得即使是意外泄漏哈希也极不可能,但是任何以上将工作。

于 2013-07-31T21:29:17.740 回答