首页 > 解决方案 > .save() 与 save pre hook 不适用于 Mongoose

问题描述

所以在过去的几天里,我一直在努力解决这个问题。

我在 Mongoose 中创建了一个用户模式,并且我有一个预先保存的钩子来散列它的密码字段。每次我尝试将用户保存到数据库时,我注意到 save 方法从未被调用过。我收到的错误消息对我来说毫无意义(当时)。事实证明,它与预保存挂钩无关,而与模式本身有关。

const UserSchema = new mongoose.Schema(
  {
    fullName: {
      type: String,
      maxlength: 50
    },
    about: {
      type: String,
      maxlength: 500
    },
    gender: {
      type: String,
    },
    dob: {
      type: String,
    },
    school: {
      type: String,
    },
    grade: {
      type: String,
      maxlength: 50
    },
    profilePicture: {
      type: String,
    },
    resume: {
      type: String,
    },
    email: {
      type: String,
      maxlength: 50
    },
    password: {
      type: String,
      minlength: 6
    },
    favoriteJobs: {
      type: Array,
      default: []
    },
    followedPost: {
    type: Array,
    default: []
    },
    posts: {
    type: Array,
    default: []
    },
    eventsGoing: {
    type: Array,
    default: []
    },
    studentChat: {
    type: Array,
    default: [StudentChatSchema]
    },
    mentorChat: {
    type: Array,
    default: []
    },
    notifications: {
    type: Array,
    default: []
    },
})

预存:

UserSchema.pre('save', function(next){
  var user = this;
  if (!user.isModified('password')) return next();

  bcrypt.genSalt(10, (err, salt) => {
    if (err) return next(err);

    bcrypt.hash(user.password, salt, (err, hash) => {
      if (err) return next(err);
      if(hash) {
        user.password = hash;
        this.password = user.password;
        console.log('Password Hashed');
        console.log(user.password);
        return next();
      }
    })
  })
  })

错误:

Error: key $isUnderneathDocArray must not start with '$'
    at serializeInto (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:911:19)
    at serializeObject (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:347:18)
    at serializeInto (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:937:17)
    at serializeObject (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:347:18)
    at serializeInto (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:937:17)
    at serializeObject (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:347:18)
    at serializeInto (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:727:17)
    at serializeObject (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:347:18)
    at serializeInto (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:937:17)
    at serializeObject (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:347:18)
    at serializeInto (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:937:17)
    at serializeObject (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:347:18)
    at serializeInto (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:937:17)
    at serializeObject (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:347:18)
    at serializeInto (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:727:17)
    at serializeObject (/Users/ferro/Desktop/United-Way/Express/node_modules/bson/lib/bson/parser/serializer.js:347:18)

标签: node.jsmongodbmongoosebcrypt

解决方案


问题出在这里:

    studentChat: {
    type: Array,
    default: [StudentChatSchema]
    },

    studentChat: {
    type: Array,
    default: []
    },

不能为数组提供“Schema”类型。呃。我在其他任何地方都找不到此错误消息,因此希望这对其他人有所帮助。


推荐阅读