我有 MemberProfiles 和 MemberPayments 集合。 MemberProfile 有 expiryDate 字段,该字段设置为当前日期为insert.I需要在将MemberPayment添加到该MemberProfile时扩展唯一MemberProfile的expirDate。
#welcome
});
我已经添加了所有必需的软件包但仍然没有用。我收到错误无法设置未定义的属性'expiryDate'
答案 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
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"}}