问题标签 [actix-web]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rust - 使用函数装饰时,如何将 App 数据传递给 actix-web 中的服务路由处理程序函数?
我在文档中找到了一个如何创建全局状态的示例,该状态受 Mutex 保护,在处理线程之间共享,可供所有路由处理程序使用。完美的!但是,我更喜欢使用附加到我的函数的属性来连接我的路由处理程序。我不知道使用属性函数并传入全局状态的语法(如果允许)。
这是来自https://docs.rs/actix-web/1.0.2/actix_web/web/struct.Data.html的 actix-web 文档的示例
注意命名的路由处理程序index
是如何被传递给web::Data
.
现在这里是我的一些代码片段。
注意我是如何调用方法App::service
来连接我的路由处理程序的。
还要注意我的路由处理程序如何没有接收到全局状态(因为我还没有将它添加到我的应用程序中)。如果我使用与文档类似的模式register_data
来创建全局 App 数据,我应该对我的方法签名、get
和post
属性以及其他任何内容进行哪些更改,以便我可以将该全局状态传递给处理程序?
还是不能使用get
andpost
属性来访问全局状态?
docker - 使用 Docker 构建缓存 Rust 依赖项
我在 Rust + Actix-web 中有 hello world web 项目。我有几个问题。首先是代码的每次更改都会导致重新编译整个项目,包括下载和编译每个 crate。我想像在正常开发中一样工作——这意味着缓存已编译的 crate 并且只重新编译我的代码库。第二个问题是它不会暴露我的应用程序。无法通过网络浏览器访问
Dockerfile:
码头工人-compose.yml:
main.rs:
货物.toml:
rust - 如何从 actix_web::HttpRequest 获取(二进制)有效负载
我正在用 Rust 编写一些 web api。我使用 XMLHttpRequest 从 JavaScript 发送 Unit8Array,我需要在服务器中将它们作为字节读取。
我的服务方法的声明是:
我如何从 actix_web::HttpRequest 有效负载中读取 Vec ?
我尝试了一些示例代码,但它也不起作用:
rust - 不能在 Rc 中借用为可变的
首先,我是 Rust 的新手 :-)
问题:我想创建一个名为 RestServer 的模块,其中包含添加路由和启动服务器的方法( actix-web )。
这是路由结构,该结构包含路由 url、请求类型(GET、POST 等)和 hanlder 是必须捕获请求并返回 HTTPResponse 的函数
最新的代码是 RestServer 的实现。最重要的部分是add_route函数,该函数接收作为参数的路由字符串、函数处理程序、请求字符串和范围。首先我创建路由对象。我检查范围是否存在于 HashMap 中,如果是,我必须采用实际范围并更新 HashSet。
当我构建代码时,我收到以下错误
我知道编译器给了我一些帮助,但老实说,我不知道该怎么做,或者我是否可以用一些简单的解决方案来做。在谷歌进行大量搜索后,我在 RefCell 中找到了一个解决方案,但不是很清楚
在此先感谢您的帮助
logging - 您如何处理在代码中更深入地记录 HTTP 请求和输出跟踪和错误消息的不同任务?
我阅读了这篇关于如何使用日志中间件在 Actix 中执行 HTTP 请求日志记录的文章:
https://docs.rs/actix-web/1.0.0/actix_web/middleware/struct.Logger.html
现在假设我还想使用 log crate 的框架在我的应用程序中添加日志记录。例如,我需要详细的调试跟踪和一个在实际恐慌停止世界之前输出恐慌消息的好地方。由于通过 log 只能配置一个记录器,这会导致问题吗?如果我还想深入记录当前的用户名或会话 ID,我是否必须一直将其传递下去,或者 Actix 是否有办法在全球范围内获得它?
rust - 从函数返回闭包与就地定义不一致
在尝试使用actix-web实现一个简单的 Web 服务器应用程序时,我遇到了不知道如何解释的 Rust 闭包明显不一致的行为。
我有以下代码:
此代码有效。注意我传递给的闭包web::get().to
。我用它来将Config
对象传递给get_user
并仍然存在web::get().to
一个没有参数的函数,因为它需要。在这一点上,我决定将闭包生成移到一个单独的函数中:
此代码无法编译并出现以下错误:
为什么它在第二种情况下失败,但在第一种情况下没有?为什么Factory
在第一种情况下满足特征但在第二种情况下不满足?可能是工厂(它的来源在这里)的错吗?是否有其他方法可以返回闭包,在这种情况下可以使用?您可以建议任何其他方法吗?(注意这Factory
不是公开的,所以我不能自己直接实现)
如果你想玩弄代码,我在这里:https://github.com/yanivmo/rust-closure-experiments 请注意,你可以在提交之间移动以查看处于工作状态或失败状态的代码。
rust - 柴油机应该使用同步参与者 actix_web::web::block 还是 futures-cpupool 运行?
背景
我正在通过 r2d2 使用柴油开发一个 actix-web 应用程序,并且不确定如何最好地进行异步查询。我找到了三个看起来合理的选项,但不确定哪个是最好的。
潜在的解决方案
同步演员
对于一个我可以使用actix 示例,但它非常复杂,并且需要大量的样板来构建。我希望有一个更合理的解决方案。
Actix_web::web::block
作为另一种选择,我可以使用actix_web::web::block
将我的查询函数包装到未来,但我不确定这对性能的影响。
然后查询是否在同一个 Tokio 系统中运行?根据我在源代码中可以找到的内容,它在底层 actix-web threadpool 中创建了一个线程。那是问题吗?
如果我没看错代码,r2d2 在获取连接时会阻塞它的线程,这会阻塞部分核心 actix-web 池。与数据库查询相同。如果我执行的查询多于该池中的线程数,这会阻止所有 actix-web 吗?如果是这样,问题就大了。
期货-cpupool
最后,可能有一些不必要的开销的安全赌注是futures-cpupool。主要问题是这意味着在我的项目中添加另一个板条箱,尽管我不喜欢在我的应用程序中不必要地浮动多个 cpu 池的想法。
由于 r2d2 和柴油都会阻塞,因此这里有很多棘手的事情。
最重要的是,不要与不使用同一个 r2d2 池的任何东西共享这个 cpupool(因为创建的所有线程可能只是阻塞等待 r2d2 连接,当工作存在时锁定整个池)。
其次(更明显一点),因此您不应该比池中的线程拥有更多的 r2d2 连接,反之亦然,因为较大的连接会浪费资源(未使用的连接/线程不断阻塞)(可能多一个线程,可能更快由 OS 调度程序而不是 cpupool 调度程序进行连接切换)。
最后,请注意您使用的是什么数据库以及那里的性能。在写入繁重的 sqlite 应用程序中运行单个连接 r2d2 和池中的单个线程可能是最好的(尽管我会推荐一个合适的数据库)。
旧答案
可能有效的旧解决方案
https://www.reddit.com/r/rust/comments/axy0hp/patterns_to_scale_actixweb_and_diesel/
本质上,推荐 Futures-cpupool。
在 future-rs 中封装阻塞 I/O 的最佳方法是什么?
一般情况下推荐 Futures-cpupool。
不起作用的旧解决方案
https://www.reddit.com/r/rust/comments/9fe1ye/noob_here_can_we_talk_about_async_and_databases/
对旧的 actix-web 版本的一个非常好的修复。从我可以找到的请求中不再有 cpu 池。
rust - 如何在 actix_web 示例代码中提取变量?
这是来自其主页的 actix_web 示例代码:
我试图通过提取行的变量来重构代码web::resource...
:
但它编译失败。为什么失败了?以及如何在这里提取该变量?谢谢。
rust - 我可以在 AWS Lambda 上使用 actix_web 而不为 HttpServer 生成线程吗?
我正在使用 AWS Lambda 和 Rust 构建一个 REST API。我希望 Rust 代码能够处理同一个库中的多个资源,因为这似乎比为每个资源创建单独的二进制文件更有意义。
我想做的是使用actix_web的配置和中间件选项来配置我的 REST 端点。因为我的代码在 AWS Lambda 环境中运行,所以我不需要使用HttpServer
. actix_web
代码只需要使用 from 的配置响应来自同一线程内的App
请求actix_web
。
我研究了 actix_lambda但它实际上启动了一个单独的线程,HttpServer
这似乎是不必要的资源使用。
我想编写的代码类似于:
问题:
- 是否可以以类似于上面代码显示的方式使用不带的
App
部分?actix_web
HttpServer
- 不使用
HttpServer
以避免产生线程有意义吗? - 为什么以前没有人这样做过?
- 为每个 REST 资源使用单独的二进制文件会更好吗?
- 我不应该使用
actix_web
并创建自己的路由和中间件解决方案吗? - 有没有更鲁莽的方法来解决这个问题?(我是 Rust 新手)
rust - actix_web 的 App::register_data 是创建单个实例还是每个线程创建一个实例?
我正在尝试为我的 设置一个全局状态actix_web::HttpServer
,这似乎register_data
是正确的 API(我可能是错的)。
从文档中,我不清楚如何创建由所有HttpServer
线程共享的应用程序数据的单个实例。这是我的代码片段:
在 POST 处理程序my_service
中,我更新了状态,MyServer
在 GET 处理程序list_service
中,它将打印出状态。
虽然my_service
存储状态成功,但list_service
仅打印空输出。我如何知道是否HttpServer
创建了单个实例MyServer
?如果没有,我如何确保它创建一个实例?国家的文件register_data
:
应用程序数据不需要是
Send
或Sync
。内部Data
类型使用Arc
. 如果您的数据实现Send
+Sync
特征,您可以使用web::Data::new()
并避免使用 doubleArc
。
我对此感到困惑。用户应该怎么做register_data
才能注册数据对象的单个实例?文档示例中的以下行是创建一个实例,还是每个线程创建一个实例?
我正在使用actix-web 1.0.9。