node.js - .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)
解决方案
问题出在这里:
studentChat: {
type: Array,
default: [StudentChatSchema]
},
至
studentChat: {
type: Array,
default: []
},
不能为数组提供“Schema”类型。呃。我在其他任何地方都找不到此错误消息,因此希望这对其他人有所帮助。
推荐阅读
- xslt - 不使用 not 选择 xslt 中的特定节点子元素
- sql-server - SSRS 调用存储过程失败,找不到用户 'dbo'
- javascript - POST https://localhost:44351/Common/SearchAvailableTechList 500(内部服务器错误)
- javascript - 根据来自多个数组的值显示/过滤元素
- kotlin - 如何使用 spyk
- java - 添加json内部对象
- node.js - 如何使用nodejs socket.io检查输入文本框或选项卡是否集中
- r - 使用 na_if 插入 NA 代替 R 中的某个值
- ruby-on-rails - 如何为 select_tag 注册 onblur 挂钩?
- java - 对数组中的数字重新排序