0

次のようにサーバーにデータを送信しています。

 save(){ 
   var el = this.parent.nodes;
   print(el);print(el.length);
   request = new HttpRequest();
    if(el.length == 1) print('No lines to save!');
     else           
     {        
      var opt = el[i].shadowRoot.nodes[0].options[el[i].shadowRoot.nodes[0].selectedIndex].text;
      print(this.parent.nodes.length);
      for(var i=1; i < el.length; i++)
             {                         
                        orderLines.add({ 
                             'poid': orderHeader[0]['OrderID'],
                            'ponum': orderHeader[0]['onum'],
                            'lnum' : i.toString(),
                           'itmid' :el[i].shadowRoot.nodes[0].value,
                           'icode' : opt,
                              'qty': el[i].shadowRoot.nodes[1].value,
                             'rqty': 0,
                             'bqty': el[i].shadowRoot.nodes[1].value,
                             'iqty': 0,
                            'biqty': el[i].shadowRoot.nodes[1].value,
                            'price': el[i].shadowRoot.nodes[2].value,
                              'rdd': orderHeader[0]['rdd'],
                              'eta': '',
                             'flag': 0 
                                        });  

                        print(orderLines);

                        request.onReadyStateChange.listen(onData_save);   
                        request.open('POST', host+'/sPO');
                        request.send(JSON.encode(orderLines));  
               }
      }
  }

私のサーバー側の機能は次のとおりです。

void main() {
  connections = new List<WebSocket>();

  HttpServer.bind(HOST, PORT).then((HttpServer server) {
   print('Server listening on port ${PORT}.');
   server.listen((HttpRequest request) {
    if (WebSocketTransformer.isUpgradeRequest(request)) {
      WebSocketTransformer.upgrade(request).then(handleWS); 
    } else gotMSG(request);        
    });
  }); 
}

handleWS(WebSocket ws){

connections.add(ws);
print('Client connected, there are now ${connections.length} client(s) connected.');
ws.listen((String message) {
  for (WebSocket connection in connections) {
  connection.add(message);
  }
},
onDone: () {
 connections.remove(ws);
 print('Client disconnected, there are now ${connections.length} client(s) connected.');
});
}

 void gotMSG(HttpRequest request) {
 switch (request.method) {
  case 'POST': 
    handlePost(request);
    break;
  case 'OPTIONS':
    handleOptions(request);
    break;
  default:
    defaultHandler(request);
 }
}

void serveRequest(HttpRequest request){
  print('Listening for GET and POST on http://$HOST:$PORT');
  request.response.statusCode = HttpStatus.FORBIDDEN;
   request.response.reasonPhrase = "WebSocket connections only";
   request.response.close();  
}

void handlePost(HttpRequest req) {
  HttpResponse res = req.response;
     switch (req.uri.path) {

       case '/login': login(req); break;
       ...
       case '/sPO': savePO(req); break;

       default: break;
     }     
}

/sPO => savePO は、送信された注文が 1 行のみの場合は 1 回実行されますが、注文に n 行が含まれている場合、関数は複数回実行され、そのパターンを見つけることができませんでした。SavePO で oracledart pub を使用しました、それで何か問題があると思い、postgresql pubを試しましたが、同じ結果が得られました.savePO関数は次のとおりです。

void savePO(HttpRequest req){

 HttpResponse res = req.response;
 addCorsHeaders(res);
 print('${req.method}: ${req.uri.path}');

 Future future() => new Future.value(true);

 req.listen((List<int> buffer) {
 var theDataLines = JSON.decode(new String.fromCharCodes(buffer));
 print(theDataLines);
        connect(db).then((conn) {  
          for (var theData in theDataLines)
               conn.execute("""
                      insert into pol 
                             (poid,ponum,lnum,itmid,icode,qty,rqty,bqty,iqty,biqty,price,rdd, eta, flag)
                      values (@poid,@ponum,@lnum,@itmid,@icode,@qty,@rqty,@bqty,@iqty,@biqty,@price,
                              to_timestamp(@rdd,'YYYY-MM-DD'), to_timestamp(@eta,'YYYY-MM-DD'), @flag)
                   """,
                {                     
                      'poid': theData['poid'],
                     'ponum': theData['ponum'],
                     'lnum' : theData['lnum'],
                    'itmid' : theData['itmid'],
                    'icode' : theData['icode'],
                       'qty': theData['qty'],
                      'rqty': theData['rqty'],
                      'bqty': theData['bqty'],
                      'iqty': theData['iqty'],
                     'biqty': theData['biqty'],
                     'price': theData['price'],
                       'rdd': theData['rdd'].toString(),
                       'eta': theData['eta'].toString(),
                      'flag': theData['flag']
                 })
        .then((_)=>conn.query('commit').toList().then((rows) {print('committed');}))
        .then((_){
                    res.write('done');
                    res.close(); 
               });
    });    // END of SQL
  }, onError: printError);  // End of server listen
 }  // END of function

私も変更しようとしました:

case '/sPO': savePO(req); break;

することが

case '/sPO': print(1); break;

6行の注文を送った後、1、4回印刷しました!!

4

1 に答える 1

0

あなたが実際に何を達成しようとしているのか、私にはわかりにくいです。

問題はおそらくあなたのsave()方法です。あなたはそれがどのように動作するかを書きましたが、あなたが達成しようとしていることについてはあまり書いていませんか?
1 つの JSON 文字列にさらに多くの行を入れて、1 つのリクエストでまとめて投稿してみませんか?

1 つのインスタンスを作成し、この 1 つのインスタンスを繰り返しrequest呼び出します。また、同じリクエスト オブジェクトにハンドラーを複数回登録すると、イベントが 1 回だけ発生したときに複数回呼び出されることになります。sendrequestonReadyStateChangeonData_save

request = new HttpRequest();直前に下に移動する必要があると思います

request.open('POST', host+'/sPO');
request.send(JSON.encode(orderLines));  

またはより良い に移動request.onReadyStateChange.listen(onData_save);request = new HttpRequest();、すべてのオーダーラインを 1 つの JSON に追加して呼び出します

request.open('POST', host+'/sPO');
request.send(JSON.encode(orderLines));  

for ループの後。

私が見るもう一つの問題は、あなたが火をつけて忘れるということです. 何らかの理由で送信リクエストが失敗した場合はどうなりますか?

Future を返す sendJSON メソッドを作成します (Completer を使用して、何か問題が発生したときに完了しonDoneますcompleteError

複数のリクエストを作成したい場合は、save()次のようなものを使用できます

// create your JSON

var futures = [];
for(i = 0; i < 5; i++) {
  futures.add(sendData(myJson)); // collects the futures returned from sendData
}
// executes all futures and waits for all to respond and then returns another future
return Future.wait()
.then((results) {
  results.forEach((r) {
    // check result
  });
});
于 2014-10-21T08:17:52.553 に答える