2015-07-20 3 views
-1

Я пытался реализовать спокойный сервер, который возвращает некоторые данные JSONed из базы данных в ответе HTTP get. Я использую ящик rustful. Пока я могу получить данные, но я не мог понять, как вернуть их в тело ответа.Возвращаемое значение - это «неразрешенное имя»

#[macro_use] 
extern crate rustful; 
extern crate rustc_serialize; 
extern crate postgres; 

use std::error::Error; 

use rustful::{Server, Context, Response, TreeRouter, Log, Handler}; 
use rustful::context::ExtJsonBody; 
use postgres::{Connection, SslMode}; 

#[derive(RustcEncodable,RustcDecodable)] 
struct Coord { 
    lat: f64, 
    long: f64, 
    expr: String 
} 

fn get(context: Context, response: Response) { 
    let conn = Connection::connect("postgresql://postgres:[email protected]", &SslMode::None).unwrap(); 
    let stmt = conn.prepare("SELECT latitude,longitude,expiry FROM coord LIMIT 1").unwrap(); 
    let result = stmt.query(&[]).unwrap(); 
    for row in result { 
     let coord = Coord { 
      lat: row.get(0), 
      long: row.get(1), 
      expr: row.get(2) 
     }; 
     println!("Latitude: {}\nLongitude: {}\nExpiry: {}", coord.lat, coord.long, coord.expr); 
    } 
    response.send(format!("{:?}", coord.lat)) 
} 

struct HandlerFn(fn(Context, Response)); 

impl Handler for HandlerFn { 
    fn handle_request(&self, context: Context, response: Response) { 
     self.0(context, response); 
    } 
} 

fn main() { 
    let server = Server { 
     host: 8080.into(), 
     handlers: insert_routes! { 
      TreeRouter::new() => { 
       Get: HandlerFn(get) 
      } 
     }, 
     ..Server::default() 
    }.run(); 

    match server { 
     Ok(_server) => {}, 
     Err(e) => println!("Cannot start server: {}", e.description()) 
    } 
} 

Код в настоящее время терпит неудачу с этой ошибкой:

src/main.rs:40:35: 40:40 error: unresolved name `coord` 
src/main.rs:40  response.send(format!("{:?}", coord.lat)) 
               ^~~~~ 
note: in expansion of format_args! 
<std macros>:2:26: 2:57 note: expansion site 
<std macros>:1:1: 2:61 note: in expansion of format! 
src/main.rs:40:19: 40:45 note: expansion site 
error: aborting due to previous error 
+1

Добро пожаловать в переполнение стека! Пожалуйста, прочитайте о создании [MCVE] (/ help/mcve), который поможет выявить проблему как для вас самих, так и для потенциальных ответчиков. В этом случае у вас довольно много кода, который является вспомогательным для вашей проблемы. – Shepmaster

+0

Спасибо, сделаю :) – Stygian

ответ

4

Переменные имеют лексическую область, то есть, где переменная доступна привязана к фигурные скобки в исходном коде. Вот небольшой пример:

fn main() { 
    { 
     let value = 42; 
    } 
    println!("{}", value); 
} 

value не доступен за пределами фигурных скобок, в котором она определена.

У вас есть такая же проблема в вашем случае:

for row in result { 
    let coord = Coord {...}; 
} 
response.send(format!("{:?}", coord.lat)) 

Каждая итерация цикла, coord создается, а затем удаляется. Нет ничего, что соответствовало бы названию coord вне цикла.

Трудно сказать вам, как исправить вашу проблему. docs for Response::send говорят (курсив мой):

Send data to the client and finish the response

Что означает, что вы можете послать только один ответ. Вам нужно будет выяснить, как объединить все ваши результаты, а затем отправить их вместе. Вероятно, массив JSON соответствовал бы счету.

+0

Благодарим вас за разъяснение! – Stygian

Смежные вопросы