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

Plumber日志记录自定义变量问题:registerHooks无法识别全局变量

解决Plumber请求日志中添加自定义变量的问题

直接在过滤器中将req_user和req_tenant挂载到当前请求的req对象上,而非使用全局变量,这样后续的钩子就能直接从req中读取这些值,同时避免多请求并发时的变量覆盖问题。

修改后的代码如下:

# Enable CORS Filtering
#' @filter auth_filter
auth_filter <- function(req, res) {
  # 将用户和租户信息直接附加到req对象
  req$user <- req$HEADERS['authorization'] %>% as.character()
  req$tenant <- req$HTTP_TENANT
  # 必须返回req和res,否则请求会被过滤器中断
  plumber::forward()
}

pr$registerHooks(
  list(
    preroute = function() {
      # Start timer for log info
      tictoc::tic()
    },
    postroute = function(req, res) {
      end <- tictoc::toc(quiet = TRUE)
      # 直接从req对象中读取自定义字段
      log_info('{convert_empty(req$user)} {convert_empty(req$tenant)} {convert_empty(req$REMOTE_ADDR)} "{convert_empty(req$HTTP_USER_AGENT)}" {convert_empty(req$HTTP_HOST)} {convert_empty(req$REQUEST_METHOD)} {convert_empty(req$PATH_INFO)} {convert_empty(res$status)} {round(end$toc - end$tic, digits = getOption("digits", 5))}')
    }
  )
)

关键说明:

  • 过滤器中必须调用plumber::forward()(或显式return(list(req, res))),否则请求会被拦截,无法进入后续处理流程。
  • 每个请求的req是独立实例,把自定义变量绑定到req上,既不会出现多请求间的变量污染,也能让钩子函数直接访问这些属性。
  • 这是Plumber处理请求上下文的标准方式,完全不需要依赖全局变量。

内容的提问来源于stack exchange,提问作者fifthace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:35:19