Clojure Biff中路由上下文:example/ds为nil及上下文修改求助
问题分析与解决
问题原因
你的use-postgres已经把ds成功添加到系统上下文中(REPL验证有效),但路由处理函数拿到的是请求上下文,两者未自动合并——因为Biff的模块路由需要通过正确方式挂载,才能让系统上下文注入到请求上下文中。
解决方案
1. 确保模块被正确加载到系统组件
在主项目的components向量中添加biff/use-module加载博客模块:
; 主项目文件 (require '[你的博客模块命名空间 :as blog]) ; 替换为实际命名空间 (def components [biff/use-aero-config biff/use-queues biff/use-jetty biff/use-chime biff/use-beholder use-postgres (biff/use-module blog/module)]) ; 新增该行
Biff的use-module会负责将模块的路由、中间件整合到系统中,并确保系统上下文传递到路由处理函数。
2. 检查中间件是否破坏上下文合并
如果已加载模块仍有问题,确认是否自定义中间件丢弃了Biff默认的上下文合并逻辑。biff/wrap-base中间件会自动合并系统与请求上下文,不要在路由中间件中覆盖该行为。
在Biff中修改上下文的方式
方式1:组件函数中修改系统上下文
像use-postgres一样,在组件函数中接收当前上下文,修改后返回新上下文:
(defn use-custom-component [ctx] (assoc ctx :custom/key "custom-value"))
将该函数加入components向量,Biff启动时会依次执行组件函数,构建最终系统上下文。
方式2:中间件中修改请求上下文
针对单个请求修改上下文,可编写自定义中间件:
(defn wrap-custom-context [handler] (fn [ctx] (handler (assoc ctx :request/custom-data "请求专属值"))))
在模块的:middleware中添加该中间件:
(def module {:middleware [wrap-custom-context] :routes ["/blog" ["/" {:get blog-home}]]})
方式3:手动合并系统与请求上下文
在REPL或自定义逻辑中,使用biff/merge-context合并两类上下文:
(def merged-ctx (biff/merge-context 系统上下文 请求上下文))
内容的提问来源于stack exchange,提问作者user28054790
相关产品推荐
相关产品推荐

