根据这个简单的代码段,我可以轻松地在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()
})
我发现中间件在设置时实际上从未实际运行预挂钩。这种事情有可能吗?
答案 0 :(得分:1)
此代码:
ServiceSchema.pre('find', function(done) {
this.find({iid: res.locals.iid})
done()
})
实际上没有运行pre hook,它只是注册它。因此,每次执行中间件时,您只需重新注册相同的挂钩。挂钩仅在您致电yourModel.find()
时执行。 pre
挂钩只能访问该模型实例内的任何内容,当然,它不包含req
对象。因此,要回答您的问题,在没有精心设计的黑客攻击的情况下,使用pre
挂钩进行您尝试做的事情是不可能的。
另外,作为一个广泛使用过Mongoose的人,我建议完全远离预挂钩。只需将该逻辑保留在服务层中即可。您可能最终会预先编写更多代码,但是一旦您不可避免地需要访问模型之外的某些数据,您的实现就不会破解。