Node.js Mongoose-将参数传递到预保存-在更新保存中不起作用
我试图在mongoose模型上传递一个参数来预保存中间件,如:Node.js Mongoose-将参数传递到预保存-在更新保存中不起作用,node.js,mongodb,mongoose,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 >
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();
});
然后:
它不适用于保存从数据库获取的现有模型,但适用于新创建的模型
如果我删除该参数,它确实有效
所以如果我打电话
subject.save(function (err, subject, count) {
...
});
…它确实有效
看起来回调实际上从未回调。因此,可能假设第一个参数是保存更新的回调
对于create,它确实可以使用传递参数
(new models.Subject(subjectInfo)).save({ user: user, correlation_id: correlationId }, function (err, subject, count) {
if (err) throw err;
...
});
关于为什么它适用于创建时保存,而不适用于更新时保存,您有什么想法吗
谢谢 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的位置。您会注意到它只接受一个参数:
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的位置。您会注意到它只接受一个参数:
经过一次又一次的搜索,这就是我的推荐 改为在虚拟字段中执行工作
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;
}
});
如果这对您没有帮助,您可能会发现另一个答案很有帮助:
或者这个github问题:
或者。在搜索和搜索之后,这是我的建议 改为在虚拟字段中执行工作
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;
}
});
如果这对您没有帮助,您可能会发现另一个答案很有帮助:
或者这个github问题:
或。仅适用于Model.update、findbyiandupdate、findOneAndUpdate、findOneAndRemove、findbyiandremove。我打电话给save。当传递的参数removedHmmmm时,它也可以调用所有中间件。。。我明白你现在的要求了。你能分享你代码的创建部分吗?建议一词,用猫鼬的话说,保存、创造和更新的想法都有非常不同的含义。当你说update时,大多数人会想到MongoDB的原生update命令。这就是我困惑的根源,是的,我只是在精神上把它分解成一个积垢操作。我假设模型/文档不是新的!isNew表示,它确实使用mongodb更新调用,但save使用挂钩。对于create和update,save上的钩子连接是否不同?save函数不例外。这是最重要的。这就是调用nextcallback的原因,在这里回调get被传递给实际的save函数。显然,它至少在大多数时候允许传递一些参数new models.SubjectsubjectInfo.save{user:user,correlation\u id:correlationId},function err,subject,count{};在这一行中,新的models.subjectInfo来自何方?如果它返回一个模型,那么您不能传递两个参数来进行保存。这只适用于model.update、findbyiandupdate、findOneAndUpdate、findoneanandremove、findbyiandremove。我打电话给save。当传递的参数removedHmmmm时,它也可以调用所有中间件。。。我明白你现在的要求了。你能分享你代码的创建部分吗?建议一词,用猫鼬的话说,保存、创造和更新的想法都有非常不同的含义。当你说update时,大多数人会想到MongoDB的原生update命令。这就是我困惑的根源,是的,我只是在精神上把它分解成一个积垢操作。我假设模型/文档不是新的!isNew表示,它确实使用mongodb更新调用,但save使用挂钩。对于create和update,save上的钩子连接是否不同?save函数不例外。这是最重要的。这就是调用nextcallback的原因,在这里回调get被传递给实际的save函数。显然,它至少在大多数时候允许传递一些参数new models.SubjectsubjectInfo.save{user:user,correlation\u id:correlationId},function err,subject,count{};在这一行中,新的models.subjectInfo来自何方?如果它返回一个模型,那么你不能通过两个参数来像那样保存。不知道为什么否决票,似乎这个问题没有一个明确的解决方案,这是一个有用的答案。@Yellow甜瓜憎恨者必须憎恨:-不知道为什么否决票,似乎这个问题并没有一个明确的解决方案,这是一个有用的答案。@yellowmool憎恨者必须憎恨:-