【问题标题】:LoopbackJs Call After Save Operation Hook only once保存操作挂钩后 LoopbackJs 仅调用一次
【发布时间】:2020-05-18 22:27:42
【问题描述】:

我的 PersitedModel 中有带有 createdOn 和 lastUpdatedOn 字段的模型,它们基本上是日期。我正在 after save 操作挂钩上更新它。这就是 MyModel.js 的样子。

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 更新的代码,那么它工作正常。所以我面临的问题基本上是操作钩子不断调用该方法。有没有办法防止这种情况。我做错了什么吗?我只想调用这个方法一次

【问题讨论】:

    标签: loopbackjs loopback


    【解决方案1】:

    对于您的用例,您应该尝试使用 mixin 而不是模型挂钩。 Loopback 有一些 documentation 关于如何制作自己的内容。您还可以在 npm 上使用它:https://www.npmjs.com/package/loopback-ds-timestamp-mixin

    【讨论】:

    • 这看起来是最好的方法。但是现在我只使用 before save hook MyModel.observe('before save', function(ctx, next) { if (ctx.instance && ctx.isNewInstance) { ctx.instance.createdOn = new Date(); } if (ctx.data && !ctx.isNewInstance) { ctx.data.lastUpdatedOn = new Date(); } next(); });跨度>
    【解决方案2】:

    对不起,我不能发表评论...

    你可以在保存创建之前和保存更新之后尝试,创建日期不会有很大差异

    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();
         });
    
    }
    

    【讨论】:

    • 是的,我最终只使用了保存之前的钩子 Channel.observe('before save', function(ctx, next) { if (ctx.instance && ctx.isNewInstance) { ctx.instance. createdOn = new Date(); } if (ctx.data && !ctx.isNewInstance) { ctx.data.lastUpdatedOn = new Date(); } next(); });然而,@nVitius 的 mixin 解决方案似乎是最好的方法。
    • @DhruvDatt 很高兴得知您找到了解决方案,感谢您的回答
    【解决方案3】:

    你应该看看这个:https://loopback.io/doc/en/lb3/Operation-hooks.html#operation-options

    基本上,您可以将选项作为最后一个参数传递给任何模型操作,然后可以被 Hook 读取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多