【问题标题】:Meteor: Disallow user from selecting id's when inserting documentsMeteor:在插入文档时禁止用户选择 id
【发布时间】:2014-06-19 22:32:47
【问题描述】:

当使用 mini-mongo 将文档插入集合中时,用户可以传递 _id 字段,并且只要文档是字符串或 ObjectID(并且不与现有 id 冲突),就会在文档上设置 _id。这对我来说似乎不明智。我希望文档的 _id 始终由服务器生成,所以我最终不会得到一个字符串(可能具有不同长度)和 ObjectID 都作为 _ids 存在的数据库。

有没有简单的方法来实现这一点?现在我能想到的最好的方法是在拒绝规则中检查 id(其中 _id 已经由 Meteor 设置或者是用户提供的值),如果它不是我想要的类型/长度,我会改变它,但这也需要检查以避免重复的ID。不太难,但对于像这样基本的东西来说似乎过于复杂。

【问题讨论】:

  • 让客户端生成_id字段的原因可能是为了最大化原理延迟补偿,这很好,但您担心的是我们必须为此付出的代价。然而,由于每个文档都必须有一个_id 字段,所以对我来说很明显 Meteor 应该为我们验证它。可惜没有:/
  • 如果您希望 _id 来自服务器,那么客户端可能只是在更新而不是插入。

标签: meteor


【解决方案1】:

查看我的回复,这是您的答案:

拒绝所有插入。创建一个methodcollectionInsert(document),检查是否指定了_id 字段。

Meteor.methods({
  collectionInsert: function(document) {
    if (document && document._id) {
      delete document._id;
    }
    // Returns the _id generated
    return collection.insert(document);
  }
});

在今天的流星版本(0.8 及更高版本)中,无论如何,服务器和客户端都会生成相同的_id。但是使用这种方法应该保证客户端模拟字段插入,并且服务器端生成的_id的版本是权威的。

【讨论】:

    【解决方案2】:

    执行此操作的正确方法可能是在Meteor.method 中进行插入。您不能在高风险应用程序中信任客户端生成的 ID,因此使用 collection#insertallow/deny 挂钩是不够的。相反,调用一个方法来执行插入,这将始终创建一个服务器生成的 ID。

    您仍然可以在客户端上存根此方法,以补偿延迟,但插入的 ID 将在服务器调用返回时被覆盖。

    【讨论】:

      猜你喜欢
      • 2017-02-17
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多