rust - 如何将从 HTML 表单提交的数据插入到 Redis 数据库中?

标签 rust lifetime

我正在尝试将用户提交的 HTTP 数据保存到 Redis 中。这是我使用 Nickel 的代码:

#[macro_use]
extern crate nickel;
extern crate redis;
extern crate hyper;

use redis::{Client,Parser, Commands, Connection, RedisResult};
use nickel::{Nickel, Request, Response, HttpRouter, MiddlewareResult,Middleware, MediaType,JsonBody};
use std::collections::HashMap;
use nickel::status::StatusCode;
use nickel_redis::{RedisMiddleware, RedisRequestExtensions};
use hyper::Url;
use url::form_urlencoded;
use std::sync::{Arc, Mutex};
use std::io;
use std::io::prelude::*;
use std::fs::File;

fn save_db<'a>(req: &mut Request, res: Response<'a>) -> MiddlewareResult<'a> {
    let mut server = Nickel::new();
    /* FIXME: connect redis*/ 
    let client = Client::open("redis://127.0.0.1/").unwrap();
    let conn = client.get_connection().unwrap();

    server.post("/confirmation", middleware!{|req, res|
        let mut form_data = String::new();
        req.origin.read_to_string(&mut form_data).unwrap();
        let _: () = conn.set("contents", form_data).unwrap();
        println!("{}", form_data);

        let mut data = HashMap::<&str, String>::new();
        data.insert("content", form_data);
        data.insert("page_title", "Save blog data".to_string());
        return res.render("app/views/blog/save.tpl", &data);
    });
}

fn main() {
    let mut server = Nickel::new();

    // start using router
    let mut router = Nickel::router();
    let client = Client::open("redis://127.0.0.1/").unwrap();
    let conn = client.get_connection().unwrap();

    router.get("/test-save-db", save_db);

    server.utilize(router);
    server.listen("127.0.0.12:8080");
}

保存.tpl

  <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>{{ page_title }}</title>
    </head>
    <body>
    <h1>Saved new blog.</h1>
    <h2>Author {{form_data}}</h2>
    <h2>Content {{content}}</h2>
    <form>
    First name:<br>
    <input type="text" name="firstname" >
    <br>
    <button type="submit" formenctype="application/x-www-form-urlencoded" formaction="/test-save-db" formmethod="post">SEND</button>
    </form> 
</body>
</html>

但是我得到这个错误

error: cannot infer an appropriate lifetime for lifetime parameter 'b due to conflicting requirements [E0495](req.origin.read_to_string(&mut form_data).unwrap();)

最佳答案

我在您的代码中看到的问题是,您正试图在 /test-save 时调用的处理程序中注册路由处理程序 (POST /confirmation) -db 路由匹配。这似乎不正确。

为了让您的代码和意图更清晰,我建议您使用 middleware! 宏,我发现这是在 Nickel 中描述路由的最简单方法。至少这是我昨天开始使用该框架以来的经验:-)

因此您的示例可能会重写如下:

fn main() {
    let client = Client::open("redis://127.0.0.1/").unwrap();
    let mut server = Nickel::new();

    server.get("/test-save-db", middleware! { |req, res|
        // do something with the request and send a response
    });

    server.listen("127.0.0.12:8080");
}

如果您需要多个处理程序共享同一个客户端,您将需要使用 std::sync::Arc 来拥有线程安全的共享状态,并为每个处理程序克隆它(它只会克隆Arc,而不是客户端)。

关于rust - 如何将从 HTML 表单提交的数据插入到 Redis 数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34914572/

相关文章:

rust - 如何在关联类型中指定生命周期参数?

rust - 枚举的类型别名

rust - 将整个宏输入传递给另一个宏

rust - 异步 fn 报告 "hidden type for ` impl Trait` 捕获未出现在边界中的生命周期”

rust - 对 Rust 的闭包生命周期感到困惑

iterator - 从闭包中返回并使用可变引用的迭代器

rust - Map上的max_by_key不允许将元组分解为键值对

rust - 我如何使用另一个 crate 中定义的宏?

rust - 你能把另一个匹配子句放在匹配臂中吗?

generics - 使用 AsRef 返回包含在输入包装器类型中的引用