nickel.rs редирект поста не найден
Я использую nickel.rs, PostgreSQL и Angular.js. Я могу вставить в мою таблицу с HTTP POST:
// insert
{
let conn = shared_connection.clone();
router.post("/api/movies", middleware! { |request, mut response|
let conn = conn.lock().unwrap();
let stmt = match conn.prepare("insert into movie (title, releaseYear, director, genre)
values ($1, $2, $3, $4)") {
Ok(stmt) => stmt,
Err(e) => {
return response.send(format!("Preparing query failed: {}", e));
}
};
let movie = request.json_as::<MovieInsert>().unwrap();
match stmt.execute(&[
&movie.title.to_string(),
&movie.releaseYear,
&movie.director.to_string(),
&movie.genre.to_string()
]) {
Ok(v) => println!("Inserting movie was Success."),
Err(e) => println!("Inserting movie failed. => {:?}", e),
};
// ERROR (1)
// return response.set(Location("/".into()));
});
}
Я знаю, что это прекрасно работает, потому что строка вставлена в таблицу PostgreSQL. Тем не менее веб-браузер Chrome показывает ошибку:
POST http://localhost:6767/api/movies 404 (Not Found)
Я также добавил код в ERROR (1)
линия
response.set(Location("/".into()));
однако консоль показывает ошибку.
expected `core::result::Result<nickel::middleware::Action<nickel::response::Response<'mw, _>, nickel::response::Response<'mw, _, hyper::net::Streaming>>, nickel::nickel_error::NickelError<'mw, _>>`,
found `&mut nickel::response::Response<'_, _>`
(expected enum `core::result::Result`,
found &-ptr)
Теперь это мой код, примененный к тому, что сказал Шепмастер.
// insert
{
let conn = shared_connection.clone();
router.post("/api/movies", middleware! { |request, mut response|
let conn = conn.lock().unwrap();
let stmt = match conn.prepare("insert into movie (title, releaseYear, director, genre)
values ($1, $2, $3, $4)") {
Ok(stmt) => stmt,
Err(e) => {
return response.send(format!("Preparing query failed: {}", e));
}
};
let movie = request.json_as::<MovieInsert>().unwrap();
match stmt.execute(&[
&movie.title.to_string(),
&movie.releaseYear,
&movie.director.to_string(),
&movie.genre.to_string()
]) {
Ok(v) => println!("Inserting movie was Success."),
Err(e) => println!("Inserting movie failed. => {:?}", e),
};
response.set(StatusCode::PermanentRedirect)
.set(Location("/".into()));
""
});
}
но произошла ошибка.
src / main.rs: 155: 18: 155: 43 ошибка: черта modifier::Modifier<nickel::response::Response<'_, _>>
не реализован для типа hyper::header::common::location::Location
[E0277]
src/main.rs:155 .set(Location("/". Into()));
наконец я исправляю вот так!
Ok(v) => {
println!("Inserting movie was Success.");
response.set(StatusCode::Ok);
},
Err(e) => println!("Inserting movie failed. => {:?}", e),
};
//response.set(StatusCode::PermanentRedirect)
// .set(Location("/".into()));
//""
return response.send("");
1 ответ
Код, как в настоящее время перечислено, не имеет никакого смысла. От вашего обработчика маршрута ничего не возвращается:
match ... {
Ok(v) => println!("Inserting movie was Success."),
Err(e) => println!("Inserting movie failed. => {:?}", e),
};
Поскольку ничего о базе данных или инфраструктуре внешнего интерфейса не имеет значения, ваш код эквивалентен этому:
#[macro_use]
extern crate nickel;
use nickel::{Nickel, HttpRouter};
fn main() {
let mut server = Nickel::new();
server.post("/api/movies", middleware! { |request, mut response|
println!("Hello");
});
server.listen("127.0.0.1:6767");
}
Если вы возвращаете что-то из обработчика, то код состояния HTTP меняется с 404 на 200.
Если вы хотите куда-то перенаправить, вам нужно явно изменить код состояния. Документация для Response::set
бывает, есть пример:
server.get("/a", middleware! { |_, mut res|
res.set(StatusCode::PermanentRedirect)
.set(Location("http://nickel.rs".into()));
""
});
Обратите внимание, что возвращается пустая строка, аналогичная предыдущей. Вы пытались вернуть Response
введите напрямую.