2017-09-21 11 views
0

私はPersitedModelのcreatedOnとlastUpdatedOnフィールドを持つモデルを持っています。これは基本的に日付です。after save操作フックでこれを更新しています。これがMyModel.jsの外観です。LoopbackJs呼び出しを保存した後に一度だけフック

module.exports = function(MyModel) { 
    MyModel.observe('after save', function(ctx, next) { 
    if (ctx.instance && ctx.isNewInstance) { 
     ctx.instance.updateAttribute('createdOn', new Date()); 
    } 
    if (ctx.instance && !ctx.isNewInstance) { 
     ctx.instance.updateAttribute('lastUpdatedOn', new Date()); 
    } 
    next(); 
}); 
} 

操作フックがこのメソッドを呼び出したままになります。また、アプリケーションがクラッシュする原因となります。

<--- Last few GCs ---> 

441366 ms: Mark-sweep 1279.7 (1410.5) -> 1279.7 (1410.5) MB, 1093.9/0.0 ms [allocation failure] [GC in old space requested]. 
442456 ms: Mark-sweep 1279.7 (1410.5) -> 1279.7 (1410.5) MB, 1090.7/0.0 ms [allocation failure] [GC in old space requested]. 
443606 ms: Mark-sweep 1279.7 (1410.5) -> 1286.6 (1403.5) MB, 1148.8/0.0 ms [last resort gc]. 
444735 ms: Mark-sweep 1286.6 (1403.5) -> 1293.7 (1403.5) MB, 1129.2/0.0 ms [last resort gc]. 


<--- JS stacktrace ---> 

==== JS stack trace ========================================= 

Security context: 00000173CF3CFB49 <JS Object> 

私はlastUpdatedOnの更新のためのコードを削除した場合、それはfine.So問題は基本的に私が直面していますことを操作フックがthis.Am私が何かをやって防ぐ方法をmethod.Isを呼び出し続けている作品違う。?このメソッドを1回呼び出すだけです

答えて

0

使用する場合は、モデルフックの代わりにmixinを使用するようにしてください。ループバックには、自分で作る方法についてのdocumentationがあります。あなたはNPMで、このために使用できるものもあります:https://www.npmjs.com/package/loopback-ds-timestamp-mixin

+0

大きな違いも」 if(ctx.instance && ctx.isNewInstance){ ctx.instance.createdOn = new Date(); } if(ctx.data &&!ctx.isNewInstance){ ctx.data.lastUpdatedOn = new Date(); } next(); }); –

0

申し訳ありませんが、私はコメントを入れることができない...

はあなたが創造のために保存および更新のために保存した後、前に試すことができます、それは勝っ作成の日付は、 {)の前に「保存し、次の関数(CTX、「Tは、これは私が MyModel.observeを(フック救う唯一の前に使用して実装されている今のgo.Howeverへの最善の方法のように見える

module.exports = function(MyModel) { 

    MyModel.observe('before save', function(ctx, next) { 
     if (ctx.instance && ctx.isNewInstance) { 
      ctx.instance.updateAttribute('createdOn', new Date()); 
     }   
     next(); 
    }); 

    MyModel.observe('after save', function(ctx, next) { 
     if (ctx.instance && !ctx.isNewInstance) { 
      ctx.instance.updateAttribute('lastUpdatedOn', new Date()); 
     }  
     next(); 
    }); 

} 
+0

はい私は最終的にセーブフックの前にのみ使用して実装を終了しました Channel.observe( '前に保存'、関数(ctx、次){ if(ctx.instance && ctx.isNewInstance){ ctx.instance.createdOn = new Date ();} IF(ctx.data && ctx.isNewInstance!){ ctx.data.lastUpdatedOn =新しいDate();} 次の();} )。 しかし、@nVitiusによるミックスインソリューションは、進歩する最良の方法のようです。 –

+0

@DhruvDattあなたが解決策を見つけたことを知り、答えに感謝します –

関連する問題