Rust actix_web传递配置到处理程序

Rust actix_web传递配置到处理程序,rust,Rust,我正在编写一个API服务器,希望读入一个配置文件,并将该信息传递给请求处理程序。我很难让生锈的事情发生 let cfg = Arc::new(read_config()); let server = HttpServer::new(|| { App::new() .wrap(middleware::Logger::default()) .service(web::resource("/api/files").route(web::get().to(move

我正在编写一个API服务器,希望读入一个配置文件,并将该信息传递给请求处理程序。我很难让生锈的事情发生

let cfg = Arc::new(read_config());
let server = HttpServer::new(|| {
    App::new()
        .wrap(middleware::Logger::default())
        .service(web::resource("/api/files").route(web::get().to(move || {
            list_files(cfg.clone());
        })))
        .service(fs::Files::new("/", "client/public").index_file("index.html"))
});
我当前遇到的错误是

56 |       let cfg = Arc::new(read_config());
   |           --- captured outer variable
...
60 |               .service(web::resource("/api/files").route(web::get().to(move || {
   |  ______________________________________________________________________^
61 | |                 list_files(cfg.clone());
62 | |             })))
   | |_____________^ cannot move out of captured variable in an `Fn` closure

如何做到这一点?将变量传递给请求处理程序的正确方法是什么?

这是因为您有两个级别的闭包。第一个是HttpServer::new()的参数,它是非移动的:它捕获对cfg的引用,然后尝试将其移动到第二个闭包web::get().to()

如果在第一个闭包中创建克隆,可以将其移动到第二个闭包中,如下所示:

let cfg = Arc::new(read_config());
let server = HttpServer::new(|| {
    let cfg = cfg.clone();
    App::new()
        .wrap(middleware::Logger::default())
        .service(web::resource("/api/files").route(web::get().to(move || {
            list_files(cfg);
        })))
        .service(fs::Files::new("/", "client/public").index_file("index.html"))
});

这是因为您有两个级别的闭包。第一个是HttpServer::new()的参数,它是非移动的:它捕获对cfg的引用,然后尝试将其移动到第二个闭包web::get().to()

如果在第一个闭包中创建克隆,可以将其移动到第二个闭包中,如下所示:

let cfg = Arc::new(read_config());
let server = HttpServer::new(|| {
    let cfg = cfg.clone();
    App::new()
        .wrap(middleware::Logger::default())
        .service(web::resource("/api/files").route(web::get().to(move || {
            list_files(cfg);
        })))
        .service(fs::Files::new("/", "client/public").index_file("index.html"))
});

有没有可能添加
列表文件
功能的定义?有没有可能添加
列表文件
功能的定义?