Флаттер положил запрос на базу данных - PullRequest
2 голосов
/ 25 октября 2019

Я работаю над приложением Flutter. у нас есть база данных PSQL, сервер Node на заднем плане. В приложении Flutter я показываю некоторую геометрию, которую я успешно извлекаю из базы данных. Теперь после изменения геометрии, например линий, я хочу иметь возможность обновлять базу данных с помощью запроса пут.

Сервер работает так:

app.put('/api/shape/:id', async (req,res) =>{

    let answer;

    if( req.body.shape_type == "line"){
        answer = await db.db.modify_line(req.params.id, req.body.info_shape);
    }

    res.send(answer);
});

И файл db.jsвыглядит следующим образом:

modify_line : async function(id_shape, info_shape){
    console.log(info_shape);
    const result = await send_query("UPDATE line SET line = $2 WHERE id_shape = $1", [id_shape, info_shape]);
    return(result);

},

В приложении Flutter я делаю это:

_makeUpdateRequest() async {
var url = globals.URL + 'api/shape/' + globals.selectedShapeID.toString();

Map data;
if (globals.selectedType == globals.Type.line) {
  String lseg = "(" + globals.pLines[globals.selectedLineIndex].p1.dx.toString() + "," +
    globals.pLines[globals.selectedLineIndex].p1.dy.toString() + "," +
    globals.pLines[globals.selectedLineIndex].p2.dx.toString() + "," +
    globals.pLines[globals.selectedLineIndex].p2.dy.toString() + ")";
  data = {
    'shape_type': 'line',
    'info_shape': {
      'id_shape': globals.selectedShapeID.toString(),
      'line': lseg,
    }
  };

} 
http.Response response;
try {
  //encode Map to JSON
  print("encode Map to JSON");
  var body = json.encode(data);
  print(body);
  response = 
  await http.put(url,
    headers: {
      "Content-Type": "application/json"
    },
    body: body
  ).catchError((error) => print(error.toString()));

} catch (e) {
  print(e);
}
return response;
}

Таблица «строки» базы данных содержит информацию «shapeID» и «lseg» в каждой строке.

В настоящее время я получаю сообщение об ошибке при попытке ввести следующий код:

{ id_shape: '619',
  line:    '(19.5,100.6,20.5,50.9)' } 
fail____error: invalid input syntax for type lseg: "{"id_shape":"619","line":"(-19.5,100.6,20.5,50.9)"}"

Как мне сформировать свой lseg json? Спасибо

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Ну, мне кажется, что вы передаете весь объект input_shape в SQL-запрос, который выглядит следующим образом: console.log:

{
  id_shape: '619',
  line: '(19.5,100.6,20.5,50.9)'
}

Очевидно, это невернодля PostgreSQL.

Я бы сказал, что ваш бэкэнд-код должен быть примерно таким:

modify_line : async function(id_shape, info_shape){
    console.log(info_shape);
    const result = await send_query(
        "UPDATE line SET line = $2 WHERE id_shape = $1",
        // Reference "line" sub-object
        [id_shape, info_shape.line],
    );
    return(result);
},

Также следует обратить внимание на формат Геометрические типы для строк:

[(x1, y1), (x2, y2)]

((x1, y1), (x2, y2))

(x1,y1), (x2, y2)

x1, y1, x2, y2

Я не уверен на 100%, читая этот формат (с начальными и конечными скобками)правильно.

1 голос
/ 29 октября 2019

Когда проблема решена, ответ будет следующим: DB.js похож на:

    modify_line : async function(id_shape, info_shape){
    const result = await send_query("UPDATE line SET line = $2 WHERE id_shape = $1", [info_shape['id_shape'], info_shape['line']]);
    return(result);

},

, а приложение Flutter выглядит так:

_makeUpdateRequest() async {
var url = globals.URL + 'api/shape/' + globals.selectedShapeID.toString();

Map data;
if (globals.selectedType == globals.Type.line) {
  String lseg = 
    "[" + globals.pLines[globals.selectedLineIndex].p1.dx.toString() + "," +
    globals.pLines[globals.selectedLineIndex].p1.dy.toString() + "," +
    globals.pLines[globals.selectedLineIndex].p2.dx.toString() + "," +
    globals.pLines[globals.selectedLineIndex].p2.dy.toString() + "]";

  data = {
    'shape_type': 'line',
    'info_shape': {
      'id_shape': globals.selectedShapeID.toString(),
      'line': lseg,
    }
  };
 } 
http.Response response;
    try {
      //encode Map to JSON
      print("encode Map to JSON");
      var body = json.encode(data);
      print(body);
      response =
        await http.put(url,
          headers: {
            "Content-Type": "application/json"
          },
          body: body
        ).catchError((error) => print(error.toString()));

    } catch (e) {
      print(e);
    }
    return response;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...