2017-05-16 2 views
0

Jedes Mal, wenn ich versuche, ein riesiges Json-Objekt (enthält Bilder base64) über das Netzwerk an meinen Knoten js server.Ich bekomme dieseNode js - So senden Sie Anfrage in kleinen Datenblock (Fehler: Request Entity zu groß)

Error: request entity too large

Es gibt Lösung wie diese link (Stackoverflow Frage), die die Grenze für den Knoten js Server zu erhöhen, empfehlen. Ich suche eine Client-seitige Lösung. Gibt es eine Möglichkeit, die gesendeten Daten abzubrechen und den Server warten zu lassen, um alle Pakete zu empfangen und dann zu verarbeiten? (Versprechen?)

Hypothetisch gesprochen, wenn meine Dateien 20mb ist, auch wenn mein Limit auf 5mb eingestellt ist, werde ich in der Lage sein, es zu senden, es wird nur mehr Zeit brauchen. Ist es möglich? Können Sie mich bitte auf die richtige Spur bringen?

ich auf der Rückseite Endseite

Hier einige Code express bin mit Bezug zu nehmen:

//AJAX CALL 
    var promise = $.Deferred(); 
    $.ajax('/module/report/ddl',{ 
     data: { 
      widget: JSON.stringify(widget), <--- large, very large 
      filename: filename, 
      username: username, 
      reportname: reportName 
     }, 
     type: 'POST', 
     success: function(result){ 
      //Do something 
      promise.resolve(result); 
     }, 
     error :function(err) { 
      /* Act on the event */ 
      promise.reject(err); 
     } 
    }); 
    return promise; 
} 

Hier ist meine Server-Seite

router.route('/ddl').post(ddlReport)); 
    function ddlReport(req, res){ 
    var filename = req.body.filename; 
    var widgets = req.body.widget; <--- Once again large 
    var username = req.body.username; 


ctrl.ddlProcess(widgets,filename,title,username,function(err, result){ 
    if(err){ 
     res.status(422).send(err); 
    }else { 
     res.send(result); 
    } 
}); 

}

Wenn Sie brauche mehr Informationen, lass es mich wissen! Ich versuche eine Lösung zu finden, die am besten ist, auch wenn es nicht die ist, die ich vorgeschlagen habe!

Vielen Dank für Ihre Zeit! Hab einen guten Tag!

+0

1) eine Synchronisierungsanforderung an den Server senden, damit die Dateiübertragung gewährleistet ist. Eine asynchrone Anfrage würde den Benutzer nicht daran hindern, zu einer anderen URL zu gehen und Ihren langen Upload zu beenden. 2) Express muss hier nichts tun. Sie können das Ergebnis von JSON.stringify durch eine Länge (sagen wir 5.000.000 Bytes) brechen, jeden Chunk in serieller Reihenfolge benennen und auf dem Server addieren (Sie müssten diese Chunks in Ihrer Sitzung speichern). 3) Verwenden Sie ein Flag, um den letzten Teil der Datei zu kennen. wie totalChunkCount oder lastChunk = true –

+0

1) Also füge ich einfach async hinzu: false zu meinem Ajax-Call, oder? 2 & 3) Ich bin neu auszudrücken, aber ich werde prüfen, wie ich meine Daten in der Benutzersitzung speichern kann. Und wenn es den letzten Brocken bekommen hat, führt es den Prozess aus, es macht Sinn, danke! – TheOneWhoMightKnow

+0

Ja, Sie sollten Sitzungen dafür verwenden. Überprüfen Sie diese https://github.com/expressjs/session. habe auch einen Backstore wie redis oder mongodb und du bist gut zu gehen. –

Antwort

0

Haben Sie versucht, Ihren großen JSON in kleine Stücke zu zerlegen und separat zu versenden? Fügen Sie einfach zusätzliche Informationen wie {Paket: 1, Gesamt: 20, Daten: ... (ein kleines Stück große Daten)} Dann senden Sie sie gleichzeitig über Ajax oder eins nach dem anderen. Und auf der Knotenserver-Seite sammeln Sie alle diese 20 Teile. Zusätzlich können Sie eine Prüfsumme haben.

+0

Wie mache ich den Server warten, um alle Paket zu erhalten? Gibt es eine Möglichkeit, dies mit Express zu tun? – TheOneWhoMightKnow

+0

Erstellen Sie ein Objekt und fügen Sie jedem asynchron empfangenen Frieden zu diesem Objekt hinzu. Bitte überprüfen Sie, ob alle Friedenselemente empfangen werden – Romick