Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose-将参数传递到预保存-在更新保存中不起作用_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 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 >

我试图在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();
});
然后:

它不适用于保存从数据库获取的现有模型,但适用于新创建的模型

如果我删除该参数,它确实有效

所以如果我打电话

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憎恨者必须憎恨:-