如何在PocketBase完成Bootstrap后执行initializeDb函数?
解决方案
你之前的问题出在对OnBootstrap()钩子时机的理解上——这个钩子是Bootstrap流程的最后一步,属于Bootstrap过程的一部分,并非Bootstrap完成之后触发。要实现「Bootstrap完成后、所有命令执行前」的逻辑,应该使用PocketBase的OnBeforeExecuteCommand()钩子,它会在任意命令(包括serve、migrate等)执行前触发,且此时Bootstrap已经完全完成。
正确实现代码
app.OnBeforeExecuteCommand().Bind(&hook.Handler[*core.BeforeExecuteCommandEvent]{ Id: "initializeDb", Func: func(e *core.BeforeExecuteCommandEvent) error { // 这里调用你的初始化逻辑 return db.initializeDb() }, })
可选:避免重复初始化
如果你的初始化逻辑只需要执行一次(比如多次执行命令时不想重复跑),可以加个全局标记控制:
var dbInitialized bool // ... app.OnBeforeExecuteCommand().Bind(&hook.Handler[*core.BeforeExecuteCommandEvent]{ Id: "initializeDb", Func: func(e *core.BeforeExecuteCommandEvent) error { if dbInitialized { return nil } err := db.initializeDb() if err == nil { dbInitialized = true } return err }, })
为什么原来的方式不对
PocketBase的Bootstrap()方法执行流程中,OnBootstrap()事件是作为最后一个步骤触发的,此时Bootstrap还在执行过程中,并非完全结束。而OnBeforeExecuteCommand()是在Bootstrap完成后,命令真正执行前的节点,完全符合你的需求。
内容的提问来源于stack exchange,提问作者svobol13
相关产品推荐
相关产品推荐

