- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一些代码,其结构类似于网络框架中的“中间件”,因此我将在这个最小示例中使用该术语。中间件函数的想法是它包装了实际的响应处理程序,因此它可以在请求到达处理程序之前修改请求,并在返回后修改响应:
struct Request;
struct Response;
trait Handler {
fn handle(&self, request: Request) -> Response;
}
trait Middleware {
fn handle(&self, request: Request, next: Box<dyn FnOnce(Request) -> Response>) -> Response;
}
我考虑过使用两个独立的函数,一个用于预处理请求,一个用于后处理响应,但是如果不诉诸 hack,我将无法在请求期间存储任何额外的状态。
服务器包含动态配置处理程序和中间件,因此它必须使用一些盒装特征对象:
struct Server {
handler: Box<dyn Handler>,
middlewares: Vec<Box<dyn Middleware>>,
}
现在,如何实现响应处理?这是我的两次尝试:
impl Server {
// First attempt: using Iterator::fold()
fn handle_request_fold<'a>(&'a self, request: Request) -> Response {
let handler_with_middlewares = self.middlewares.iter()
.rev()
.fold::<Box<dyn FnOnce(Request) -> Response + 'a>, _>(
Box::new(|request| self.handler.handle(request)),
|next, middleware| {
Box::new(|request| middleware.handle(request, next))
}
);
handler_with_middlewares(request)
}
// Second attempt: using recursion
fn handle_request_recurse(&self, request: Request) -> Response {
self.handle_request_from(request, 0)
}
fn handle_request_from<'a>(&'a self, request: Request, index: usize) -> Response {
if index >= self.middlewares.len() {
self.handler.handle(request)
} else {
let next = Box::new(
|r: Request| self.handle_request_from(r, index + 1));
self.middlewares[index].handle(request, next)
}
}
}
两次尝试都给出了相同的错误,这表明我在这里做的根本错误:
error[E0759]: `self` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
--> src/lib.rs:25:67
|
19 | fn handle_request_fold<'a>(&'a self, request: Request) -> Response {
| -------- this data with lifetime `'a`...
...
25 | Box::new(|request| middleware.handle(request, next))
| ^^^^ ...is captured and required to live as long as `'static` here
我知道 trait 对象有一个隐式的 'static
生命周期,所以我尝试添加显式生命周期,如您所见,但没有帮助。我不明白为什么编译器会在这里的任何地方要求 'static
生命周期;没有什么(包括闭包)可以逃脱 handle_request_*
函数,对吧?
最佳答案
在发布之后,我想通了:传递给 Middleware
的盒装特征对象也需要非 'static
生命周期。
trait Middleware {
fn handle<'a>(&self, request: Request,
next: Box<dyn FnOnce(Request) -> Response + 'a>)
-> Response;
}
fn handle_request_from(&self, request: Request, index: usize) -> Response {
if index >= self.middlewares.len() {
self.handler.handle(request)
} else {
let next = Box::new(
move |request| self.handle_request_from(request, index + 1));
self.middlewares[index].handle(request, next)
}
}
关于rust - 如何实现动态列表 "middleware"函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64768036/
我正在尝试安装 webpymail ( https://code.google.com/p/webpymail/wiki/Installation ),我按照教程中的说明进行了所有操作,但是在启动该应
我已经创建了一个应该针对每个 请求运行的中间件,因此我将其添加到 Http\Kernel 的 $middleware 属性中。我还在这个中间件中使用了 Auth::check() ,所以我的中间件应该
我正在将使用 django_cms 的应用程序从一台服务器(一切正常)移动到另一台服务器,并在过去 4 小时内试图找出导致此错误的原因。非常欢迎提出建议! mod_wsgi (pid=21972):
示例代码可在 https://github.com/baumgarb/reverse-proxy-demo 上获得README.md 解释了如果您克隆存储库,如何重新产生问题。 我有一个 API 网关
长话短说,我有一个相当奇怪的路由场景,我需要在调用参数中间件之前调用中间件: router.param('foo', function (req, res, next, param) { // G
我在本地开发环境中没有这个问题,但我只是使用 nginx + gunicorn 部署了应用程序(第一次部署应用程序),每当我尝试发出请求时都会收到此回溯。 2012-01-21 22:24:36 [5
我在安装了 python 2.6.2 的 Ubuntu 9 上运行 Apache2。当我尝试访问 django 应用程序上的页面时出现以下错误: File "/usr/local/lib/python
我是 django 和 python 的新手,我试图在一段 django 代码上运行服务器,但我遇到了以下问题, Kinnovates-MacBook-Pro:platformsite Kinnova
我想澄清 config.ru 文件以指定 Rack 中间件,而不是使用 config.middleware 数组。 如果 config.ru 通常如下所示: require ::File.expand
我目前正在尝试用基于 express + webpack-middleware 的更强大的解决方案替换我使用 webpack-dev-server 的旧设置。所以我曾经像这样运行它:“webpack-
我开始使用带有 node/express 环境的 webpack 开发一个带有 react- 的 ReactJS 服务器端渲染应用程序路由器。我对每个 webpack 包在开发和生产(运行时)环境中的
我想为Guzzle写一个中间件它将特定的键添加到 form_params 并用值填充它。在我读过的文档中how to modify the headers但尚未找到有关 $request 对象其他属性
我目前正在研究各种中间件解决方案,这些解决方案将使我能够使用多种语言创建能够相互通信的应用程序。 ZeroC产品套件似乎是理想的选择,因为它提供了一种语言不可知的方式来定义数据和对数据进行操作的服务(
本文主要针对Golang的内置库 net/http 做了简单的扩展,通过添加中间件的形式实现了管道(Pipeline)模式,这样的好处是各模块之间是低耦合的,符合单一职责原则,可以很灵活的通过中间件
我有一个包含 url 的表单输入,我需要验证给定的 URL 没有被第 3 方 API 列入黑名单,我不确定是否需要使用 Middleware或创建特定表格 Request并在将该请求传递给命令之前验证
它说 The Slim Framework implements a version of the Rack protocol. As a result, a Slim application can
我想编写自己的中间件来检查当前用户是否是某个组的成员。如果是,用户可以移动到路由,如果不是,用户将被重定向到不同的页面。 我的中间件正在工作,但我不知道如何获取当前用户 ID。我试过 Auth::us
本文实例讲述了Django框架中间件(Middleware)用法。分享给大家供大家参考,具体如下: 1、面向切面编程 切点(钩子) 切点允许我们动态的在原有逻辑中插入一部分代码
我想做这样的事情: $app->mount('dashboard', new Travel\Controllers\Dashboard())->before(function() use ($app)
我正在尝试在我的reactjs应用程序中应用redux。由于这些错误,我无法继续: 我确信我已经安装了我需要的所有依赖项。这是我的 package.json 的相关部分 "dependencies":
我是一名优秀的程序员,十分优秀!