我正在尝试将一个参数传递给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()的任何想法?
谢谢!
答案 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