我正在尝试编写一个中间件,它将为查询字符串设置额外的参数。用例是能够添加额外的身份验证令牌,例如,根据后端的要求添加到请求中,但希望独立于请求创建本身来注入它。
这就是我的中间件(伪代码)的样子:
class MyMiddleware < Struct.new(:app, :key, :value)
def call(env)
env.params[key] = value #1
#env.params = {key => value} #2
app.call env
end
end
- 上面引发了 NoMethodError(未定义的方法 []=' for nil:NilClass)`
- 上面设置了参数哈希,但参数没有编码为查询字符串的一部分。查询字符串保持中间件开始处理请求之前的状态。
我的分析是,由于查询字符串是从 rack_builder.rb:191 中的参数构建的
def build_response(connection, request)
app.call(build_env(connection, request))
end
def build_env(connection, request)
Env.new(request.method, request.body,
connection.build_exclusive_url(request.path, request.params), #<== rack_builder.rb:191
request.options, request.headers, connection.ssl,
connection.parallel_manager)
end
中间件没有机会设置额外的参数。虽然 env 有一个 params 属性,但它是 nil 并且在中间件被调用期间或之后似乎没有被触及。
所以,我有以下问题: 1. 是否有支持的方式来实现这一目标?2. 如果没有,有没有办法重建查询字符串作为中间件执行的一部分?3. 将 URL 构建推迟到大多数请求中间件链执行之后会更好吗(当然,在适配器开始做它的事情之前;或者在适配器中做它)?4. 还有其他选择吗?
感谢任何指导。