【问题标题】:using _.omit on mongoose User in node.js在 node.js 中对 mongoose 用户使用 _.omit
【发布时间】:2013-08-01 13:45:59
【问题描述】:

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

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

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

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

U

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 的某些功能),请随时接受教育我知道做这种事情的正确方法。

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

谢谢

【问题讨论】:

    标签: node.js mongoose underscore.js


    【解决方案1】:

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

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

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

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

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

    但是,在尝试了这些方法之后,我个人认为应该为 Account 提供一个单独的集合,其中包含登录详细信息和一个 User 集合,这将使哈希值非常泄露即使是偶然也不太可能,但以上任何方法都可以。

    【讨论】:

    • 谢谢,我感觉这不是“普通”的 javascript...至于你建议使用 user.toJSON() 查看文档我有点困惑。我希望 toJSON 返回 JSON(即一个字符串)并且文档还说 The return value of this method is used in calls to JSON.stringify(doc) 所以我再次,我希望一个字符串,但它说返回的类型是一个对象。我知道 javascript 字符串是对象,但仍然 - 我不会将返回字符串的方法记录为返回对象的方法。所以我想我可能不得不使用 toObject() 而不是 toJSON()。
    • 我也会考虑UserAccount的分离。
    • toJSONstringify 的名字让每个人都感到困惑 - 它们只是坏名字 - 简单明了。在 mongoose 中,toJSON 的意思类似于“纯数据 javascript 对象”,然后您可以将其传递给 JSON.stringify 以获取您的实际 JSON 字符串。
    • 那么toJSON和toObject有什么区别?
    • 这有点微妙。 toJSON 在许多 javascript 项目中更通用,而 toObject 是更特定于猫鼬的,但猫鼬让您通过转换选项自定义行为。我使用 toObject 在服务器端获取规范对象,并使用 toJSON 作为发送到浏览器的“有线格式”,但这只是我自己的约定。
    猜你喜欢
    • 2016-06-03
    • 2015-10-29
    • 2017-04-14
    • 2017-05-14
    • 1970-01-01
    • 2013-12-27
    • 2014-12-07
    • 2016-05-17
    • 2012-12-09
    相关资源
    最近更新 更多