我正在尝试将用户提交的 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/