Попытка реализовать rocket_cors CorsOptions в API rust

#rust #cors #rust-rocket

#Ржавчина #cors #rust-ракета

Вопрос:

Я новичок в rust и использую rocket для создания простого CRUD API, который позже я хотел бы поместить в корзину AWS EC2. У меня есть один или два основных маршрута, и я хотел начать внедрять CORS, чтобы приложение react могло вызывать мой API. Я пробовал несколько руководств и примеров, но я все еще застрял.

Учебные пособия, которые я просмотрел:

 [dependencies]
rocket = "0.4.6"
rocket_codegen = "0.4.6"
rocket_cors = "0.5.1"
diesel = "1.4.5"
dotenv = "0.15.0"
serde = "1.0.117"
serde_json = "1.0.59"
serde_derive = "1.0.117"
chrono = "0.4.19"

[dependencies.rocket_contrib]
version = "*"
default-features = false
features = ["json"]
 

Мой файл прикреплен в виде фрагмента кода

 #![feature(proc_macro_hygiene, decl_macro)]

#[macro_use]
extern crate rocket;
#[macro_use]
extern crate serde_derive;

use std::error::Error;
use rocket::http::Method;
use rocket_cors::{AllowedHeaders, AllowedOrigins};
use rocket_contrib::json::Json;

mod notes;
mod user_creds;

use notes::Notes;
use user_creds::UserCreds;

#[get("/api/v1/db/read")]
fn read_db() -> amp;'static str {
    "reading"
}

#[get("/api/v1/govee")]
fn govee() -> amp;'static str {
    "Hello, govee!"
}

#[post("/api/v1/db/notes", format = "json", data = "<notes>")]
fn get_notes(notes: Json<Notes>) -> Json<Notes> {
    notes
}

#[post("/api/v1/login", format = "json", data = "<user_creds>")]
fn login(user_creds: Json<UserCreds>) -> Json<UserCreds> {
    println!(
        "user creds, {}, {}",
        user_creds.username, user_creds.password
    );
    user_creds
}


fn main() {
    let allowed_origins = AllowedOrigins::some_exact(amp;["http://localhost:8080"]);

    // You can also deserialize this
    let cors = rocket_cors::CorsOptions {
        allowed_origins,
        allowed_methods: vec![Method::Get].into_iter().map(From::from).collect(),
        allowed_headers: AllowedHeaders::some(amp;["Authorization", "Accept"]),
        allow_credentials: true,
        ..Default::default()
    }
    .to_cors();

    rocket::ignite()
        .mount("/", routes![read_db])
        .attach(cors)
        .launch();
} 

Изображение ошибки в ссылке:

введите описание изображения здесь

Ответ №1:

CorsOptions::to_cors возвращает a Result , что означает, что он потенциально может возвращать ошибку. Вы должны обработать эту ошибку, прежде чем сможете использовать ее в качестве Fairing :

 let cors = rocket_cors::CorsOptions {
  allowed_origins,
  allowed_methods: vec![Method::Get].into_iter().map(From::from).collect(),
  allowed_headers: AllowedHeaders::some(amp;["Authorization", "Accept"]),
  allow_credentials: true,
  ..Default::default()
}
.to_cors()
// panic if there was an error
.expect("error creating CORS fairing");
 

Теперь вы можете прикрепить его как обтекатель:

 rocket::ignite()
  .mount("/", routes![read_db])
  .attach(cors)
  .launch();
 

Комментарии:

1. Вам не нужно добавлять ошибку, вам просто нужно как-то с ней справиться. Добавление .expect("error creating CORS fairing") обработает ошибку.