【问题标题】:The "right way" to architecture voting with Mongoose?使用 Mongoose 进行架构投票的“正确方式”?
【发布时间】:2016-09-26 22:40:26
【问题描述】:

我正在使用 Mongoose/MongoDB 创建一个 Web 应用程序来存储将被投票的信息。我将在投票中存储用户名和 IP 地址(以便选民可以根据需要更新/修改他们的投票)。

根本问题:在 Mongoose 架构中安全架构投票的最佳方式是什么?

目前,我的架构如下所示(简化):

var Thing = new Schema({
  title: {
    type: String
  },
  creator: {
    type: String
  },
  options: [{
    description: {
      type: String
    },
    votes: [{
      username: {
        type: String
      },
      ip: {
        type: String
      }
    }]
  }]
});

mongoose.model('Thing', Thing);

虽然这使得查询任何给定Thing 的数据库变得超级容易,但出于显而易见的原因,它变得更加安全 - 我不想将用户名和 IP 地址返回给浏览器。

问题是,我不确定哪个是安全地将Thing 数据返回到浏览器的最佳/最不痛苦的方案:

  1. 循环遍历Thing.options中的每个选项,然后子循环遍历Thing.options[i].votes中的每个投票以找到请求数据的用户所投的票,然后删除所有投票以摆脱其他用户数据。这似乎非常耗费资源,但我找不到在子数组中使用 indexOf 的方法(欢迎对此进行指导),即Thing.options.votes.indexOf(username) 或类似的东西。

  2. 将投票信息存储在现有的User 架构中,然后每次我想查询单个Thing 时都必须在所有用户中搜索投票数据并将其粘贴在一起。这似乎也效率低下/更耗费资源/比必要的更复杂。

  3. 创建一个单独的Vote 架构,以便更方便地存储数据,但随后添加另一个数据库调用(一个用于Thing,一个用于Vote)。

这个问题有些复杂,因为有不同的投票方式,这是最简单的。

研究……为了后代:

This question 解决数据库中的投票问题,但用于关系数据库,而不是 MongoDB/Mongoose。

This question 涉及 Mongoose/Node.js 应用程序架构,但与投票无关。

This NPM Module 向 Mongoose 模式添加投票,但不太符合我的需求。

This post 看起来很有希望,因为作者正在做我在上面第 1 点中描述的事情(参见作者帖子中的清单 13),但他仍然创建了一个嵌套循环,从清单的第 22 行开始13、循环遍历每个选项/选项,然后遍历每个选项/选项的每次投票。

【问题讨论】:

  • "我不想将用户名和 IP 地址返回给浏览器"您为什么会这样认为?您可以对server.js 中的IP 地址执行操作,而不必通过res.send() 将实际IP 发送到浏览器。
  • 当我向用户发送特定于投票的详细信息时,当前架构会将所有其他用户数据发送给他们......我真的不希望任何人访问我的用户的用户名和IP 地址。

标签: node.js mongodb mongoose


【解决方案1】:

作为一个快速提示 - 为了防止从数据库中泄漏 IP 地址 - 我建议添加额外的集合来存储所有投票敏感数据,但在同一文档中仍然有其他投票数据。

这在存储数据时会产生很小的开销,但根据设计,IP 信息不会提供给调用者,并且不需要在每次调用时进行额外的数据清理以保护数据。

【讨论】:

  • 我想得越多,这个选项听起来就越好。它增加了一些查询复杂性,但最终我为投票创建了一个单独的模式,并将投票 ID 添加到 Thing 的相关选项中。与使用嵌套循环来删除我不想向用户展示的数据相比,这感觉像是一个更清洁的解决方案。感谢您的第二意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多