【问题标题】:mongoose changing update on pre('update') does not work on validationmongoose 在 pre('update') 上更改更新不适用于验证
【发布时间】:2018-11-17 13:09:45
【问题描述】:

下面的我的代码包含模式和一个 pre('update') 中间件来操作模式的 name 属性。实际上,如果值已存在于项目集合中,我只想为 name 属性添加一个后缀。

const ItemSchema = mongoose.Schema({
  ...
  name : {type : String, required : true, unique : true, trim : true},
  ...
})

ItemSchema.pre("update", async function() {
  let name = this.getUpdate().$set.name;
  if (!name) return Promise.resolve();
  let count = await ItemModel.find({name}).count().exec();
  if(count>0) name = name + "_SOME_SUFFIX_BY_SOME_LOGIC";
  this.getUpdate().$set.name = name;
});

ItemSchema.plugin(require('mongoose-unique-validator'));

const ItemModel = mongoose.model('Item', ItemSchema);
module.exports = ItemModel;

当我尝试更新/修补 name 属性时,计数似乎正确获取数字 1 并通过后缀更新名称。之后,我用正确操作的名称正确更新了更新对象中的名称(因此集合中肯定不存在带有后缀的名称)

但是现在,当我尝试更新时,出现以下错误:

验证失败:名称:错误,预计 name 是唯一的。价值: `[名称]_SOME_SUFFIX_BY_SOME_LOGIC'

所以它告诉我,新的后缀名称已经存在于数据库中,即使它不存在。

(我已经在数据库中查找了后缀名称,但我可以保证它不存在,因为我在测试集合上运行它,所以还没有很多条目)

节点版本:8.1.1 mongoose 版本:5.1.3 系统:ubuntu 16.04

【问题讨论】:

    标签: mongoose mongoose-schema


    【解决方案1】:

    我实际上发现,mongoose-unique-validator 是这里的问题。我在一个 mongoose 问题中找到了一条评论,描述了原因。

    因为 mongoose-unique-validator 依赖于异步操作,例如 .count() 来验证一个文档是否存在于数据库中,它是 两个 .count() 调用可能大致同时执行, 都返回 0,然后都插入 MongoDB。你需要做 一些锁定操作,使其在一般情况下正常工作。

    解决此问题的唯一方法是仅使用一个进程并设置 您的 mongodb 连接池大小为 1,但这限制了 您可以运行的应用服务器,并且只有在 mongodb 保留的情况下才能运行 它在每个连接的基础上阻塞操作的传统行为。

    issue link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 2019-06-20
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多