问题:
我在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