我想在将检索到的Object保存到Session后使用Mongoose Model中定义的方法。虽然不行。将这些方法存储到会话后丢失这些方法是否正常?
Puppies.findOne({_id:123}).then(puppy => puppy.bark()) // WOOF WOOF
// First Request
Puppies.findOne({_id:123}).then(puppy => {
req.session.puppy = puppy
})
// Second Request somewhere else in the app
app.use(function(req,res,next){
req.session.puppy.bark() // req.session.puppy.bark is not a function
})
答案 0 :(得分:1)
我遇到了确切的问题,但我相信会发生的事情是,当你在会话中存储变量时,它是toObject()'d,导致它变成一个简单的JavaScript对象,而不是保持为模型的实例。我使用Model.hydrate
作为重新创建此Model实例的方法。
app.use(function(req,res,next){
let puppyModel = mongoose.model("puppy");
let puppy = puppyModel.hydrate(req.session.puppy);
puppy.bark() // Awooo
});
这主要是创建一个新模型,然后用所有相关信息填充它,以便它成为克隆。
因为需要所有相关信息才能进行更新(包括_id,如果你有的话),我相信你可能需要扩展toObject函数来返回getter / virtuals:
puppySchema.set('toObject', { getters: true, virtuals: true });
否则,当它试图保存并且它缺少_id字段时,它将无法保存它。
我希望其他人可以提供更好的方法来执行此操作和/或解释为什么在存储它时将转换为对象并且不能保留为Model的实例。
答案 1 :(得分:0)
我认为Ciaran Blewitt所说的是正确的。最后只使用mongoose statics:
解决了这个问题schema.statics.bark(puppy) {
console.log(puppy.sound)
}
// First Request, storing Puppy in Session
Puppy.findOne({_id:123}).then(puppy => {
req.session.puppy = puppy
})
// Second Request somewhere else in the app
app.use(function(req,res,next){
Puppy.bark(req.session.puppy) // WOOF WOOF
})