gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:36:16 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com