没有从另一个模型调用回送存储组件afterRemote / beforeRemote钩destroyContainer

时间:2018-07-27 12:02:12

标签: node.js cron hook loopbackjs strongloop

问题

我在server.js中有一个cronjob,它在启动时启动,以便在一定时间后删除容器。不过,在删除它们之前,我想检查它们是否未通过其他“容器元”模型(DB中的PersistedModel)实现为未标记为“不可删除”,因为我无法在容器中保存有关容器的元数据容器模型(数据源是文件系统,因此仅f.stat元数据可用)。 现在,通过直接调用Container.destroyContainer(name)从API资源管理器中删除容器时,将调用beforeRemote("destroyContainer")钩子,而不是afterRemote("destroyContainer")钩子。

但是,当我通过cronjob删除容器时,即使调用了相同的方法,也不会调用任何远程方法挂钩。

我尝试过的事情:

将其包装在Promise / Promise中或仅使用回调没有区别,也使用afterRemote(**)并检查ctx.methodString === "container.destroyContainer"是否也没有帮助。 同样,从其他模型调用Container.destroyContainer时,不会调用容器模型的before / afterRemote挂钩。

什么有效,为什么我需要它:

删除容器,通过另一个元容器模型属性进行过滤,也可以很好地实现,即使在使用loopback-component-storage API的仅回调方法时也是如此。我只需要挂钩即可删除容器后删除相关的元信息和/或在此之前进行一些检查。

-

感谢任何帮助/提示!

源代码:

这是我在server.js中的cronjob(使用kelektiv/node-cron package)简化为必要的部分并摆脱了诺言:

const CronJob = require( "cron" ).CronJob
boot( app, __dirname, ( err ) => {
  if ( err ) throw err
let Container = app.models.Container

const garbageCollectorJob = new CronJob({
  cronTime: "0 * * * * *", // runs every minute (test)
  onTick: function() {
    // first get all available containers
    Container.getContainers( ( err, deleteableContainers ) => {
    if ( err ) {
      throw err
    } else {
      deleteableContainers.map( ( container ) => {
        console.log( `deleted ${  container.name}` )
        Container.destroyContainer( container.name, ( err, result ) => {
          if ( err ) throw ( err )
          else console.log( "finished" )
          })
        })
      }
    })
  },
start: false,
})
// start the cronjob explicitely
garbageCollectorJob.start()

})
container.js中的

是我的beforeRemote / afterRemote挂钩:

Container.beforeRemote( "destroyContainer", ( ctx, unused, next ) => {
    console.log( "Container about to be deleted" )
    let container = ctx.req.params.container
    // this hook is not called before cronjob deletion or from another model, only when directly call (from API Explorer for example)
    next()
})

Container.afterRemote( "destroyContainer", ( ctx, affectedInstance, next ) => {
    console.log( "Container was deleted, now softdelete file metainfo, metacontainer, task, process, fileRef" )
    // this hook is not called after cronjob deletion
    next()
}

npm:6.0.0 nodejs的:8.1.2 回送:3.20 回送组件存储:3.3.1 操作系统:OS X El Capitan 10.11.6

0 个答案:

没有答案