You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:06:02