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

时间:2017-03-07 01:51:07

标签: mongodb meteor meteor-autoform

我有 MemberProfiles MemberPayments 集合。 MemberProfile expiryDate 字段,该字段设置为当前日期为insert.I需要在将MemberPayment添加到该MemberProfile时扩展唯一MemberProfile的expirDate。

#welcome

});

我已经添加了所有必需的软件包但仍然没有用。我收到错误无法设置未定义的属性'expiryDate'

1 个答案:

答案 0 :(得分:1)

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

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

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

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

最后,您的;对象中存在语法错误($set),findOne选择器包含{profile: doc.memberId},但您的MemberProfiles架构显示只有_id

中的1}}和expiryDate字段。

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

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方法来处理您的quickForm(因此在客户端执行所有操作),您需要添加以下AutoForm挂钩以确保在保存文档之前调用SimpleSchema .clean()方法(这将是执行你的autovalue逻辑。

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

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

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