如何使用quickform设置触发器以添加到流星中的日期
how to set a trigger to add to a date in meteor using quickform
我有 MemberProfiles 和 MemberPayments collections.The MemberProfile 有 expiryDate 字段设置为 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.
中只有一个 _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 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"}}
我有 MemberProfiles 和 MemberPayments collections.The MemberProfile 有 expiryDate 字段设置为 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.
_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 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"}}