我是使用mongoose中间件的新手,不知道我是否关注它。这是目的。保存部门后,我想在大学对象中填充大学并保存departmentId。
DepartmentSchema.post('save', function(next) {
var departmentId = this._id;
University.findOne({
_id: this.university
}, function(err, university) {
if (!university.departments) {
university.departments = [];
}
university.departments.push(new ObjectId(departmentId));
university.save(function(err) {
if (err) return console.log('err-->' + err);
// saved!
});
});
});
这很好但我不确定为什么在Cascade style delete in Mongoose中他们使用了exec()和next()调用。你能告诉我这些电话的目的吗?我不知道他们做了什么,也找不到相关的文件。我只是想确保我没有遗漏任何东西。
clientSchema.pre('remove', function(next) {
// 'this' is the client being removed. Provide callbacks here if you want
// to be notified of the calls' result.
Sweepstakes.remove({
client_id: this._id
}).exec();
Submission.remove({
client_id: this._id
}).exec();
next();
});
答案 0 :(得分:2)
发布中间件没有引用下一个函数,你不能进行任何流量控制。它实际上通过了刚刚保存的部门,所以你的代码可以是这样的:
DepartmentSchema.post('save', function(department) {
var departmentId = department._id;
在pre
中间件中,您可以按执行顺序访问next
中间件。这是特定钩子上的定义顺序。
// hook two middlewares before the execution of the save method
schema.pre('save', pre1);
schema.pre('save', pre2);
function pre1(next) {
// next is a reference to pre2 here
next()
}
function pre2(next) {
// next will reference the hooked method, in this case its 'save'
next(new Error('something went wrong');
}
// somewhere else in the code
MyModel.save(function(err, doc) {
//It'll get an error passed from pre2
});
Mongoose还使您能够在parallel中执行pre
中间件,在这种情况下,所有中间件都将并行执行,但在每个中间件调用done之前,hooked方法将不会执行。< / p>
对于exec()函数,有两种方法在Mongoose中执行查询,要么将回调传递给查询,要么用exec():User.remove(criteria, callback)
或User.remove(criteria).exec(callback)
对其进行链接,如果你没有将回调传递给查询,它将返回一个查询对象,除非你用exec()