Meteor中的此代码。
Template.message.helpers({
message: function() {
var message = Messages.findOne({ _id: FlowRouter.getParam('messageId')});
var curTime = new Date();
console.log(message.createdAt.getHours());
return message;
}
});
给我这个例外:
Exception in template helper: message@http://localhost:3000/app/app.js?hash=0da6be4507e857f169e0cecb7b0874729eae4663:239:13
bindDataContext/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3051:14
Blaze._wrapCatchingExceptions/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1715:14
wrapHelper/</<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3103:14
Template._withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3744:12
wrapHelper/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3102:12
Spacebars.dot@http://localhost:3000/packages/spacebars.js?hash=ebf9381e7fc625d41acb0df14995b7614360858a:234:13
template.message.js/Template.message</<@http://localhost:3000/app/app.js?hash=0da6be4507e857f169e0cecb7b0874729eae4663:85:31
doRender@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2086:20
viewAutorun/</<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1934:18
Template._withTemplateInstanceFunc@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3744:12
viewAutorun/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1932:14
Blaze._withCurrentView@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2271:12
viewAutorun@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1931:12
Tracker.Computation.prototype._compute@http://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:339:5
Tracker.Computation@http://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:229:5
Tracker.autorun@http://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:613:11
Blaze.View.prototype.autorun@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1944:14
Blaze._materializeView/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2080:5
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:640:12
Blaze._materializeView@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2079:3
materializeDOMInner@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1532:9
Blaze._materializeDOM@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1474:3
Blaze._materializeDOM@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1483:7
Blaze._materializeView/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2113:25
Tracker.nonreactive@http://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:640:12
Blaze._materializeView@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2079:3
Blaze.render@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2370:3
_render@http://localhost:3000/packages/kadira_blaze-layout.js?hash=dbd1396d04e62378fc8792cdef18869a1108cedd:204:5
render/</<@http://localhost:3000/packages/kadira_blaze-layout.js?hash=dbd1396d04e62378fc8792cdef18869a1108cedd:77:9
withValue@http://localhost:3000/packages/meteor.js?hash=27829e936d09beae3149ecfbf3332c42ccb1596f:1077:17
withoutInvocation/<@http://localhost:3000/packages/meteor.js?hash=27829e936d09beae3149ecfbf3332c42ccb1596f:464:26
Meteor.bindEnvironment/<@http://localhost:3000/packages/meteor.js?hash=27829e936d09beae3149ecfbf3332c42ccb1596f:1105:17
onGlobalMessage@http://localhost:3000/packages/meteor.js?hash=27829e936d09beae3149ecfbf3332c42ccb1596f:401:11
meteor.js:930:11
它实际上被打印了两次,但我觉得它很大,没有必要在这里展示两次。
app.js的第239行看起来像这样(这里是第7行)。
Template.message.helpers({ // 34
message: function () { // 35
var message = Messages.findOne({ // 36
_id: FlowRouter.getParam('messageId') // 36
}); // 36
var curTime = new Date(); // 37
console.log(message.createdAt.getHours()); // 38
return message; // 40
} // 41
但是时间仍然会打印到控制台。
我的目标是使用createdAt日期从当前Date对象中减去它并获得时间增量。但我从来没有这么远,因为无论我尝试用message.createdAt做什么产生这个奇怪的异常。
如果我只是做console.log(message.createdAt),我会在浏览器控制台中看到两个ISO格式的日期,还有两个例外。
如果我尝试使用message.createdAt.getTime()之类的东西,我会得到一个Unix时间戳。
到底发生了什么事?
我实际上能够减去日期并按预期使用它,但是尽管代码有效,但异常仍然显示出来。
答案 0 :(得分:2)
您看到错误的原因是因为正在运行帮助程序,尝试从尚未准备好的订阅中获取数据。它最终有效,因为一旦订阅 准备就绪,帮助程序就会重新运行,一切都很顺利。要解决此问题,只需使用Template.subscriptionsReady
:
<template name="message">
{{#if Template.subscriptionsReady}}
{{message}}
{{else}}
{{> SomeLoadingTemplate}}
{{/if}
</template>
注意:此模板仅在全部执行时才会执行
message
帮助程序 模板级订阅是&#34; Ready&#34;而是会显示一个 加载器模板执行else部分。
关于问题的评论,用if (date) {...}
包装你的逻辑:这将消除错误,但并不能真正解决问题。当没有必要时,助手仍在运行多次。隐藏这样的潜在错误似乎有点code smell。
答案 1 :(得分:-1)
你有一个模板,一个助手和一个所有叫做#34; message&#34;的局部变量。即使这不是您错误的来源,我也会轻轻地建议他们使用不同的名称。