2017-05-18 24 views
1

流行のこのコード。流星:テンプレートヘルパーの例外

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: [email protected]://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 
[email protected]://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3744:12 
wrapHelper/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3102:12 
[email protected]://localhost:3000/packages/spacebars.js?hash=ebf9381e7fc625d41acb0df14995b7614360858a:234:13 
template.message.js/Template.message</<@http://localhost:3000/app/app.js?hash=0da6be4507e857f169e0cecb7b0874729eae4663:85:31 
[email protected]://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2086:20 
viewAutorun/</<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1934:18 
[email protected]://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:3744:12 
viewAutorun/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1932:14 
[email protected]://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2271:12 
[email protected]://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1931:12 
[email protected]://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:339:5 
[email protected]://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:229:5 
[email protected]://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:613:11 
[email protected]://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1944:14 
Blaze._materializeView/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2080:5 
[email protected]://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:640:12 
[email protected]://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2079:3 
[email protected]://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1532:9 
[email protected]://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1474:3 
[email protected]://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:1483:7 
Blaze._materializeView/<@http://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2113:25 
[email protected]://localhost:3000/packages/tracker.js?hash=997515fa2d5b0530ba07741da556c4b36963ef3b:640:12 
[email protected]://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2079:3 
[email protected]://localhost:3000/packages/blaze.js?hash=f33d3dfed63a491d24e3aa07ad66c24b5fe8c761:2370:3 
[email protected]://localhost:3000/packages/kadira_blaze-layout.js?hash=dbd1396d04e62378fc8792cdef18869a1108cedd:204:5 
render/</<@http://localhost:3000/packages/kadira_blaze-layout.js?hash=dbd1396d04e62378fc8792cdef18869a1108cedd:77:9 
[email protected]://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 
[email protected]://localhost:3000/packages/meteor.js?hash=27829e936d09beae3149ecfbf3332c42ccb1596f:401:11 
    meteor.js:930:11 

それは実際には2回印刷されますが、私は二度ここに表示大規模かつ不必要だと感じました。

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)を実行すると、ブラウザコンソールで2つのISOフォーマット日付が表示されますが、2つの例外があります。

私がmessage.createdAt.getTime()のような何かを試すと、私はUnixタイムスタンプを取得します。

何が起こっているのですか?

私は実際に日付を減算して意図したとおりに使用することができましたが、コードは機能していても例外は表示され続けました。

+0

(反応的な変更のために)ヘルパーが複数回実行されているため、複製が表示されます。 JS Dateオブジェクトである 'createdAt'とは何ですか? – chazsolo

+0

mongoコレクションのISONateとして表示されますが、JSのDateオブジェクトと見なします。 yearとgetTime()のようなDate属性をいくつか使うことができます。 –

+0

そのヘルパーをレンダリング/コールする前にサブスクリプションが終了するのを待っていますか? – chazsolo

答えて

2

エラーが表示される理由は、ヘルパーが実行されていて、まだ準備ができていないサブスクリプションからデータをフェッチしようとしているためです。サブスクリプションになると、ヘルパーは再実行され、すべて正常です。

<template name="message"> 
    {{#if Template.subscriptionsReady}} 
    {{message}} 
    {{else}} 
    {{> SomeLoadingTemplate}} 
    {{/if} 
</template> 

注:このテンプレートは ローダーが表示されます代わりに、すべての テンプレートレベルのサブスクリプションが「準備完了」の場合のみmessageヘルパーを実行します。この問題を解決するには、単にあなたがTemplate.subscriptionsReadyとヘルパーラップelse部分を実行するテンプレート。

if (date) {...}とあなたのロジックをラップする質問にコメントを、について

:これはエラーを取り除くだろうが、実際に問題を解決されていません。ヘルパーは、必要がない場合でも複数回実行されています。このような潜在的なエラーを隠すには、少しcode smellのようです。

0

テンプレート、ヘルパー、ローカル変数はすべて「メッセージ」と呼ばれます。それがあなたのエラーの原因ではないとしても、私はそれらをすべて異なる名前にすることを丁寧に提案します。

関連する問題