2013-12-11 36 views
1

我想传递一个参数预先保存在猫鼬模型像中间件:猫鼬 - 参数传递到预先保存 - 在更新不工作保存

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()更新的回调。

对于创造,它与传递参数

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

    ... 
}); 

为什么它为保存()上创建的任何工作思路,但不保存()上更新?

谢谢!

回答

0

model.save()具有1的参数,该参数应该是回调函数。我仍然不完全确定如何设置所有设置,因为您编写代码的样式有点不合常理。该模型的保存方法只能采取回调,像这样:

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) { 

    }); 
}); 

对于更新在猫鼬,我们这样做:

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

+0

这只适用于Model.update,findByIdAndUpdate,findOneAndUpdate,findOneAndRemove,findByIdAndRemove。我打电话save()。它也可以工作,调用所有中间件,当传递的参数被删除时 –

+0

嗯......我明白你现在要问什么。你可以分享你的代码的“创建”部分吗?根据猫鼬的说法,建议的意思是保存,创建和更新的想法都有不同的含义。当你说“更新”时,大多数人会想到MongoDB的本地更新命令。这是我的困惑的根源 – srquinn

+0

叶普,我只是在精神上把它分解为一个CRUD操作。我假设当一个模型/文档不是新的(!isNew)时,它确实使用了mongodb update()调用,但是使用save()使用了钩子。对于创建vs更新,save()上的钩子可能连接不同吗? –

3

搜索和搜索后,这是我推荐的。

改为在虚拟域中进行工作。

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

+0

@bummi,现在试试:-) –

+0

不知道为什么downvotes,似乎没有真正的解决这个问题的明确方案,这是一个有用的答案。 –

+0

@yellowmelon仇恨仇恨:-) –