是否存在一个在保存和更新时均触发的前/后挂钩?

时间:2019-07-03 09:16:32

标签: mongodb mongoose mongoose-schema

我有例如。

<form action="score" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="Upload">
</form>

我假设在所有schema.pre('save', (next) => { console.log('save fired'); next(); }); schema.update()事件上都将触发“保存”,因为从技术上来讲都是“保存”的事情。

例如,在架构中修改值为schema.create()的操作,需要检查新值是否不会引发unique: true(11000)错误并引发自己的错误。 / p>

是否有比以下更干净的方法

DuplicateKey

是否也没有用于处理“任何更新”的预钩子,而不必指定findOne,findMany等?

1 个答案:

答案 0 :(得分:0)

  

是否也没有用于处理“任何更新”的预钩子,而不必指定findOne,findMany等?

不。您需要手动提供每个。

  

例如,修改唯一值的操作:在架构中为true,需要检查新值是否不会引发DuplicateKey(11000)错误并引发自己的错误。

https://stackoverflow.com/a/38946126/10706046-您需要为每个操作创建一个钩子。

  

我认为在所有schema.update()和schema.create()事件上都会触发“保存”,因为从技术上来讲都是“保存”的事情。

不。这是MongoDB中的两个单独的操作。您需要为createfindOneAndUpdate创建一个钩子。

另一方面,我的问题是我正在实施验证,以在createUpdateCommon(incomingData)中创建和更新。

我正在检查传入的数据(在创建或更新时)是否不是例如引用不存在的countryId。

因此在createUpdateCommon中,我有类似city.findOne(incomingData.city)之类的东西。

请勿为此使用钩子。请改用架构验证器
像这样:

const userSchema = new Schema({
  name: String,
  city: {
    type: String, //probably use ObjectID instead
    validator: (value) => !!cityModel.findOne(value.city) //returns true if finds a city
  }
}