Как я могу определить необязательный подпуть с Rocket? - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь упаковать приложение Vue по пути, указанному Rocket (под /admin). Я написал следующие совпадения:

#[get("/admin/<path..>")]
fn admin_panel(_admin: AdminUser, path: Option<PathBuf>) -> Option<NamedFile> {
    match path {
        Some(admin_path) => match NamedFile::open(Path::new("admin/").join(admin_path)).ok() {
            Some(admin_file) => Some(admin_file),
            // if the file is not found, we fallback onto admin/index.html, so the client routing can kick in
            None => NamedFile::open(Path::new("admin/index.html")).ok()
        },
        None => NamedFile::open(Path::new("admin/index.html")).ok()
    }
}

#[get("/admin/<_path..>", rank = 2)]
fn admin_panel_user(_user: AuthenticatedUser, _path: Option<PathBuf>) -> &'static str {
    "Sorry, you must be an administrator to access this page."
}

#[get("/admin/<_path..>", rank = 3)]
fn admin_panel_redirect(_path: Option<PathBuf>) -> Redirect {
    Redirect::to(uri!(login::login))
}

Однако при этом, когда я пытаюсь получить доступ к /admin, я получаю 404. Мне нужно создать новый маршрут только с "/ admin" и перенаправить до /admin/index.html, но это не идеально.

Я думал, что определение PathBuf как Option сделает его необязательным, но, похоже, оно не работает.

Как сделать так, чтобы сопоставитель запросов работал, когда в запросе есть и нет пути?

1 Ответ

0 голосов
/ 21 апреля 2020

Эта функциональность еще не поддерживается Rocket. Возможность его добавления обсуждалась в этом PR на Github , чтобы работать аналогично тому, что я ожидал.

На данный момент решение состоит в том, чтобы сделать что-то похожее на опубликованный пример :

#[get("/")]
fn index() -> String {
    everything(None)
}
#[get("/<path..>")]
fn everything(path: Option<PathBuf>) -> String {
    format!("{:?}", path)
}
...