Mongoose方法没有存储在Session中?

时间:2018-03-21 18:40:07

标签: express mongoose

我想在将检索到的Object保存到Session后使用Mongoose Model中定义的方法。虽然不行。将这些方法存储到会话后丢失这些方法是否正常?

来自Mongoose模型的调用方法工作正常:

Puppies.findOne({_id:123}).then(puppy => puppy.bark()) // WOOF WOOF

在Session中存储模型并且调用方法失败:

// 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
})

2 个答案:

答案 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

解决了这个问题

puppy.model.js

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
})