Mongoose - 将参数传递给预先保存 - 在更新保存中不起作用

时间:2013-12-11 17:26:43

标签: node.js mongodb mongoose

我正在尝试将一个参数传递给mongoose模型上的预保存中间件,如:

subject.save({ user: 'foo', correlationId: 'j3nd75hf...' }, function (err, subject, count) {
    ...
});

它被传递给两个预存中间件

首先:

schema.pre('save', function (next) {
    // do stuff to model

    if (arguments.length > 1)
        next.apply(this, Array.prototype.slice.call(arguments, 1));
    else
        next();
});

然后:

schema.pre('save', function(next, metadata, callback) {
    // ...
    // create history doc with metadata
    // ...

    history.save(function(err, doc) {
        if(err) throw err;

        if (typeof metadata == 'object')
            next(callback);
        else
            next();
    });
});

它不能保存从db获取的现有模型,但它确实适用于新创建的模型。

如果删除参数,它会起作用。

所以如果我打电话......

subject.save(function (err, subject, count) {
    ...
});

......它确实有用。

看起来回调永远不会回调。所以也许假设第一个参数是save()更新的回调。

对于create,它适用于传递参数

(new models.Subject(subjectInfo)).save({ user: user, correlation_id: correlationId }, function (err, subject, count) {
    if (err) throw err;

    ...
});

有关为何在创建时使用save()而不是在更新时使用save()的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:4)

搜索和搜索后,这就是我的建议。

改为在虚拟领域工作。

schema.virtual('modifiedBy').set(function (userId) {
  if (this.isNew()) {
    this.createdAt = this.updatedAt = new Date;
    this.createdBy = this.updatedBy = userId;
  } else {
    this.updatedAt = new Date;
    this.updatedBy = userId;
  }
});

如果这对您没有帮助,您可能会发现其他答案有用:https://stackoverflow.com/a/10485979/1483977

或者这个github问题:

https://github.com/Automattic/mongoose/issues/499

this

答案 1 :(得分:0)

model.save()的arity为1,该参数应该是回调函数。我仍然不完全确定你是如何设置所有设置的,因为你编写代码的样式有点陌生。模型的save方法只能采取如下回调:

Subject.findOne({ id: id }, function (err, subject) {
  subject.set('someKey', 'someVal');

  // You can only pass one param to the model's save method
  subject.save(function (err, doc, numAffected) {

  });
});

对于mongoose的更新,我们这样做:

Subject.update({ id: id}, function (err, numAffected) {
  // There is no doc to save because update() bypasses Subject.schema
});

此链接显示Model.save()的定义位置。你会发现它只接受一个参数: https://github.com/LearnBoost/mongoose/blob/3.8.x/lib/model.js#L167