如何使用quickform设置触发器以添加到流星中的日期

how to set a trigger to add to a date in meteor using quickform

我有 MemberProfilesMemberPayments collections.The MemberProfileexpiryDate 字段设置为 insert.I 的当前日期,每当将 MemberPayment 添加到该 MemberProfile 时,都需要延长该唯一 MemberProfile 的到期日期。

 MemberProfiles = new Mongo.Collection('memberProfiles');
 MemberProfileSchema = new SimpleSchema({
 expiryDate: {
   type: Date,

   autoValue: function () {

    return  moment().toDate();
    },

    autoform: {
        type: "hidden"
    }
} 

// to insert into Memb erProfiles
 {{> quickForm collection="MemberProfiles" id="insertMemberProfileForm"      type="insert" class="new-recipe-form"}}

 //the code for MemberPayments collection

 MemberPayments = new Mongo.Collection('memberPayments');

MemberPayments.before.insert(function (userId, doc) {

let memberProfile= MemberProfiles.direct.findOne({profile: doc.memberId});

  MemberProfiles.update(doc.memberId, {

    $set: {
         expiryDate: moment().add(31, 'days');
,
     }
 }
)

});

我已经添加了所有必要的包,但仍然没有 work.I 出现错误 无法设置未定义的 属性 'expiryDate'

如果没有更完整的应用程序示例或参考 github 或其他地方的完整项目,尝试和解决此类问题是一项挑战。

但是,当我通读您的代码时,我注意到您的 MemberProfiles.update() 函数中存在问题。我还注意到,您似乎只是从客户端处理您的表单(例如,因为您的快速表单未使用 Meteor 方法),因此您将不得不手动调用 SimpleSchema .clean() 方法来生成您的自动值。请记住,您的客户端方法现在可能工作正常,但是一旦您删除 insecure 包,您将必须实施 Meteor 方法来执行插入或配置您的 collection allow/deny允许客户端插入的规则(这很危险)。

由于您使用的是 moment.js,因此您需要注意在存储到 mongodb 之前始终从 object 时刻提取日期。在这种情况下,您试图将 expiryDate 设置为从 moment().add(31, 'days') 返回的值,这只是另一个时刻 object.

此外,我假设您想将 31 天添加到 expiryDate 的当前值,但是您永远不会使用 expiryDate 初始化时刻。因此,您将始终将 expiryDate 设置为函数执行后的 31 天。

最后,您有一个语法错误($set object 中的 ;)并且您的 findOne 选择器包含 {profile: doc.memberId} 但是您的 MemberProfiles 模式说您的 collection.

中只有一个 _idexpiryDate 字段

试试这个解决上述问题的新逻辑,看看是否能解决您的问题。

MemberPayments.before.insert(function (userId, doc) {
  let memberProfile = MemberProfiles.direct.findOne({profile: doc.memberId});

  if (memberProfile) {
    if (!memberProfile.expiryDate) {
      console.log("expiryDate was not previously set!");
    } else {
      MemberProfiles.update({profile: doc.memberId}, {
        $set: {
          expiryDate: moment(memberProfile.expiryDate).add(31, 'days').toDate()
        }
      });
    }
  } else {
    console.log("memberProfile not found");
  }
});

现在这个问题已经解决了,您需要解决客户端未生成自动值的问题。您可以通过调用 SimpleSchema .clean() 方法来完成此操作。由于您没有使用 Meteor Methods 来处理您的 quickForm(因此在客户端执行所有操作),您需要添加以下 AutoForm 挂钩以确保在保存文档之前调用 SimpleSchema .clean() 方法(然后将执行你的 autovalue 逻辑)。

AutoForm.hooks({
  insertMemberProfileForm: {
    before: {
      insert: function(doc) {
        MemberProfileSchema.simpleSchema().clean(doc);
        return doc;
      }
    }
  }
});

您应该将以上代码放在创建快速表单的模板的 onRendered() 回调中(例如,在 HTML 中包含以下代码的模板)。

{{> quickForm collection="MemberProfiles" id="insertMemberProfileForm" type="insert" class="new-recipe-form"}}