2016-09-30 10 views
1

Ich verwende AJAX POST Daten zum Server, die Node.js Code verwenden. Sehr kurz, zwei Dateien in diesem Testprojekt. Hier ist main.html:AJAX senden Daten an Node.js Server

<!DOCTYPE HTML> 
<html> 
    <head> 
    </head> 
    <body> 
     <script> 
      var xhr = new XMLHttpRequest(); 
      xhr.open('POST', '/', true); 
      xhr.send('hello'); 
     </script> 
    </body> 
</html> 

hier der Server-Code:

const http = require('http'); 

http.createServer(function(req,res) { 
    console.log(req.body); 
}).listen(3000); 

Vielleicht haben Sie diesen Server bekannt wird console.log() 'undefined'. Die Frage ist also, warum es "undefiniert" ist? Wie bekomme ich AJAX-Daten auf dem Server?

Ich kenne andere Lösung nach this question.

Können Sie mir auf andere Weise helfen, Daten bequem zu bekommen?

+0

Haben Sie eine Route für ''/'' definiert? – abdulbarik

+0

@abdulbarik danke, ich denke, http.createServer wird jede Anfrage erhalten. Egal auf welcher Route. – suoyong

Antwort

3

Sie haben Server allright erstellt, aber es gibt zwei Probleme:

  1. Anschluss Endpunkt. Ihr AJAX ist POST, also müssen Sie POST Anfragen richtig analysieren (nicht genau löst Ihr Problem, aber Sie müssen Anfragemethoden unterscheiden).
  2. Node.js analysiert nicht standardmäßig Ihre POST Körper, müssen Sie ihm sagen, wie es gemacht wird, zum Beispiel mit querystring Modul.

In Kombination zusammen:

var qs = require('querystring'); 

http.createServer(function(req, res) { 
    if (request.method == 'POST') { 
     var body = ''; 

     request.on('data', function(data) { 
      body += data; 
     }); 

     request.on('end', function() { 
      var post = qs.parse(body); 

      // Use your POST here 
      console.log(post); 
     }); 
    } 
}).listen(3000); 

JSON-Daten - sauberere Lösung:

Sie benötigen eine AJAX-Daten mit JSON zu kodieren, und als es auf der Server-Seite zu analysieren wie folgt:

http.createServer(function(req,res) { 
    if (req.method == 'POST') { 
     var jsonPost = ''; 

     req.on('data', function(data) { 
      jsonPost += data; 
     }); 

     req.on('end', function() { 
      var post = JSON.parse(jsonPost); 

      // Use your POST here 
      console.log(post); 
     }); 
    } 
}).listen(3000); 

Sie wären noch besser dran mit Express.js Framework dafür, mit seinem bodyParser Modul.


UPDATE - Wie chunks gepuffert werden:

Betrachten einfaches Beispiel - sende in xhr.send() eine LARGE Textmengen, die Content-Length überschreitet. folgend auf data Ereignis als zu tun:

req.on('data', function(data) { 
    console.log(data); 
    body += data; 
}); 

Sie werden sehen, so etwas wie:

<Buffer 0a 0a 4c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 20 61 64 69 70 69 73 63 69 ... > 
<Buffer 65 74 20 71 75 61 6d 20 63 6f 6e 67 75 65 20 6c 6f 62 6f 72 74 69 73 2e 20 50 65 6c 6c 65 6e 74 65 73 71 75 65 20 74 65 6d 70 75 73 20 75 6c 6c 61 6d ... > 
<Buffer 61 2e 20 56 69 76 61 6d 75 73 20 76 69 74 61 65 20 61 6e 74 65 20 6d 65 74 75 73 2e 20 4d 61 75 72 69 73 20 71 75 69 73 20 61 6c 69 71 75 65 74 20 65 ... > 

Das zeigt, dass die Daten in Blöcken empfingen am data Ereignisse. Nur unter end Ereignis erhalten Sie die gesamten Daten gesendet (wenn Sie es zuvor aggregiert haben). Node.js behandelt das nicht, deshalb benötigen Sie Module von Drittanbietern.

Das ist - Sie können nicht einfach req.body der Anfrage erhalten, als wurde es überhaupt nicht gesetzt.

+0

Vielen Dank für die Detailerklärung. Wie kann ich die Daten jedoch direkt erhalten? wie den Körper mit 'req.body' zu bekommen. – suoyong

+0

Ich bitte um eine andere Antwort. wenn ich das Expressframework nutze (body-parse) und es als Middleware benutze. aber wenn ich form() Post verwende, wird der Server die Daten trösten. Im Gegensatz dazu, wenn ich Ajax Post-Daten verwenden, die Server-Konsole nichts? – suoyong

+0

Weil es Daten behandelt, die Sie mit AJAX in Chunks senden, und Ihr Job ist es, es zwischenzuspeichern. So funktioniert Node. Verwenden Sie Module, um den POST zu analysieren, und machen Sie sich keine Sorgen. – Nevertheless

Verwandte Themen