2016-01-21 88 views
-2

我试图将用户提交的HTTP数据保存到Redis中。这是我的代码中使用镍:如何将从HTML表单提交的数据插入到Redis数据库中?

#[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"); 
} 

Save.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();)

+2

为什么要在看起来像镍请求处理程序的内部创建一个新的镍服务器?我只希望一次只能有一台服务器。 – Shepmaster

+0

如果我不创建一个新的镍服务器,我不会调用函数server.post()。你如何解决问题? – kenzi

+0

您还没有提供[MCVE](/ help/mcve)(首先强调** C **,然后是** M **),所以我无法编译您的代码以提供任何有用的反馈。我很确定这段代码没有正确使用Nick,但我无法猜测为什么你已经突出显示的行('req.origin.read_to_string(&mut form_data).unwrap()')会导致你所说的错误。 – Shepmaster

回答

0

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

为了使您的代码和意图更清晰,我建议您使用宏,我发现这是用镍描述路线最简单的方法。至少这是我的经验,因为在开始使用框架昨日:-)

那么如下的例子可能被改写:

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,而不是客户端)。

相关问题