我尝试从单页应用程序发出POST请求时遇到404错误,即使该路由在Postman中也有效。

路由

#[post("/letters", format = "application/json", data = "<new_letter>")]
fn write_letter(new_letter: Json<NewLetter>, conn: DbConn) -> Json<Value> {
    Json(json!({
        "status": Letter::write(new_letter.into_inner(), &conn),
        "result": null
    }))

}

我已经设置了main.rs以允许CORS
let (allowed_origins, failed_origins) = AllowedOrigins::some(&["http://localhost:3000"]);
let options = rocket_cors::Cors {
    allowed_origins: allowed_origins,
    allowed_methods: vec![Method::Get, Method::Put, Method::Post, Method::Delete]
        .into_iter()
        .map(From::from)
        .collect(),
    allowed_headers: AllowedHeaders::all(),
    allow_credentials: true,
    ..Default::default()
};

所有路由都在Postman中工作,而GET请求在我的应用程序中工作。但是,当我尝试从应用程序发出POST请求时,我在前端收到404,并从后端记录以下内容:

OPTIONS /api/letters:
=> Error: No matching routes for OPTIONS /api/letters.
=> Warning: Responding with 404 Not Found catcher.
=> CORS Fairing: Turned missing route OPTIONS /api/letters into an OPTIONS pre-flight request
=> Response succeeded.

这是我的前端供引用:
writeLetter: (letter) => axios.post(`${base_url}/api/letters`, letter)
  .then(res => {
     if (res.status == 201) {
      console.log("letter successfully submitted")
      return res
    }
    throw new Error(res.error)
  }),

我实现Axios或rocket_cors的方式是否有问题?我找到了one similar issue,但似乎配置正确。

最佳答案

我认为我对OPTIONS路由日志的方式不满意。我以为它正在向前端发送404响应,因为Warning: Responding with 404 Not Found catcher行,但其下面的两行表示Response succeeded,因此我在DevTools中进行了更深入的研究。

选项发送回200响应,并且由于我只考虑创建的201响应,因此引发了错误。

我将我的API更新为

if (res.status == 201 || res.status == 200) {
  console.log("letter successfully submitted")
  return res
}

从而避免了引发错误。

关于javascript - 从React应用发送POST请求到Rocket后端时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50572190/

10-12 06:54