在Express Middleware中定义Mongoose Pre Hook

时间:2015-11-12 20:06:40

标签: node.js mongodb express mongoose

根据这个简单的代码段,我可以轻松地在find查询中附加iid的附加参数。你怎么能在中间件里面完成同样类型的钩子呢?

// SchemaFile.js
import mongoose, {Schema} from 'mongoose'
export const ServiceSchema = new Schema({
  displayName: String,
  iid: String
})

// This works great, but `iid` needs to be dynamic
ServiceSchema.pre('find', function(done) {
  this.find({iid: 'hard_coded'})
  done()
})

// SomeMiddleware.js
import {ServiceSchema} from 'SchemaFile'
app.use(function(req, res, next) {
  ServiceSchema.pre('find', function(done) {
    this.find({iid: res.locals.iid})
    done()
  })
  next()
})

我发现中间件在设置时实际上从未实际运行预挂钩。这种事情有可能吗?

1 个答案:

答案 0 :(得分:1)

此代码:

  ServiceSchema.pre('find', function(done) {
    this.find({iid: res.locals.iid})
    done()
  })

实际上没有运行pre hook,它只是注册它。因此,每次执行中间件时,您只需重新注册相同的挂钩。挂钩仅在您致电yourModel.find()时执行。 pre挂钩只能访问该模型实例内的任何内容,当然,它不包含req对象。因此,要回答您的问题,在没有精心设计的黑客攻击的情况下,使用pre挂钩进行您尝试做的事情是不可能的。

另外,作为一个广泛使用过Mongoose的人,我建议完全远离预挂钩。只需将该逻辑保留在服务层中即可。您可能最终会预先编写更多代码,但是一旦您不可避免地需要访问模型之外的某些数据,您的实现就不会破解。