在mongoose中间件中级联删除中exec()和next()调用的作用是什么?

时间:2015-03-13 03:29:43

标签: express mongoose mean-stack meanjs

我是使用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();
});

1 个答案:

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

链接它,否则它不会执行