【问题标题】:How can I 'resolve' a MogoDB object to a specific JSON structure in Nodejs?如何将 MongoDB 对象“解析”为 Node Js 中的特定 JSON 结构?
【发布时间】:2018-11-19 22:39:18
【问题描述】:

假设 MongoDB 中有以下用户模式(使用 Mongoose/Nodejs):

var UserSchema = new Schema({
    email: {
        type: String,
        unique: true,
        required: 'User email is required.'
    },
    password: {
        type: String,
        required: 'User password is required.'
    },
    token: {
        type: String,
        unique: true,
        default: hat
    },
    created_at: {
        type: Date,
        default: Date.now
    },
});

// mongoose-encrypt package
UserSchema.plugin(encrypt, {
    secret: 'my secret',
    encryptedFields: ['email', 'password', 'token', 'created_at']
});

现在假设我想从 API 端点返回用户对象。事实上,假设我想从多个 API 端点返回用户对象。可能作为独立对象,也可能作为相关模型。

显然,我不希望 password 出现在返回的结构中 - 在许多情况下,我也不希望 token 被返回。我可以在每个端点上手动执行此操作,但我更喜欢无需考虑的解决方案 - 能够简单地检索用户,故事结束,而不必担心事后取消设置某些值。

我主要来自 Laravel 世界,那里存在 API 资源 (https://laravel.com/docs/5.6/eloquent-resources) 之类的东西。我已经尝试实现mongoose-hidden 包(https://www.npmjs.com/package/mongoose-hidden)来隐藏密码和令牌,但不幸的是,它似乎破坏了我正在使用的加密包。

一般来说,我是 Nodejs 和 MongoDB 的新手 - 有没有好的方法来实现它?

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

How to protect the password field in Mongoose/MongoDB so it won't return in a query when I populate collections?

你可以这样使用:Users.find().select("-password"), 但是每当您将查询的项目发送给用户(res.json()...)时都会这样做,因此您可以使用包含的此字段进行操作,然后在将其发回之前将其从用户中删除(这是使用承诺方法,最佳实践)。 如果您希望将您的更改用作默认设置,您可以将“select: false”添加到架构对象的密码字段中。

希望这会有所帮助:)

【讨论】:

  • 看,我试图避免每次都需要手动操作。从开发人员的角度来看,我宁愿被要求选择加入密码,而不是选择退出,并且可能忘记在特定端点上执行此操作(或者让不熟悉项目的未来开发人员忘记)。 “范围”可能是一个很好的词来描述我在寻找什么。
  • 在这种情况下,您可以将“select: false”添加到架构对象的密码字段中。
  • 但是当你想用保存的密码做某事时,你必须记住添加“Users.find({}).select('+password')”。
  • 太好了,这正是我想要的。选择加入安全范例比选择退出更强大和安全。最好必须明确定义我确实需要密码的几次,而不是需要明确定义我的所有其他实例。如果您可以更新答案以反映 cmets,我会接受。
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多