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 введите напрямую.

Другие вопросы по тегам