Wenn Sie Express verwenden (leistungsstarke, erstklassige Webentwicklung für Node.js), können Sie Folgendes tun:
HTML:
<form method="post" action="/">
<input type="text" name="user[name]">
<input type="text" name="user[email]">
<input type="submit" value="Submit">
</form>
API-Client:
fetch('/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
user: {
name: "John",
email: "[email protected]"
}
})
});
Node.js: (seit Express v4.16.0)
// Parse URL-encoded bodies (as sent by HTML forms)
app.use(express.urlencoded());
// Parse JSON bodies (as sent by API clients)
app.use(express.json());
// Access the parse results as request.body
app.post('/', function(request, response){
console.log(request.body.user.name);
console.log(request.body.user.email);
});
Node.js: (für Express <4.16.0)
const bodyParser = require("body-parser");
/** bodyParser.urlencoded(options)
* Parses the text as URL encoded data (which is how browsers tend to send form data from regular forms set to POST)
* and exposes the resulting object (containing the keys and values) on req.body
*/
app.use(bodyParser.urlencoded({
extended: true
}));
/**bodyParser.json(options)
* Parses the text as JSON and exposes the resulting object on req.body.
*/
app.use(bodyParser.json());
app.post("/", function (req, res) {
console.log(req.body.user.name)
});
app.use(express.bodyParser());
.Sie können das
querystring
Modul verwenden:Wenn Sie beispielsweise ein
input
Feld mit Namen habenage
, können Sie mit der Variablen darauf zugreifenpost
:quelle
var POST = qs.parse(body); // use POST
Nur für Noobs wie mich: Wenn der Name des Eingabetextfelds "Benutzer" ist,Post.user
werden die Daten dieses Feldes angezeigt. zBconsole.log(Post.user);
readable
Rückruf verwenden, anstatt die Daten in eine Textzeichenfolge zu integrieren. Sobald es abgefeuert ist, ist die Leiche verfügbar durchrequest.read();
req.connection.destroy();
dass die Rückrufe nicht ausgeführt werden können! Zum Beispiel wird der "on end" -Rückruf mit dem abgeschnittenen Körper ausgeführt! Dies ist wahrscheinlich nicht das, was Sie wollen ...Stellen Sie sicher, dass die Verbindung unterbrochen wird, wenn jemand versucht, Ihren RAM zu überfluten!
quelle
var POST = qs.parse(body); // use POST
Nur für Noobs: Wenn der Name des Eingabetextfelds "Benutzer" lautet, zeigt Post.user die Daten dieses Felds an. zB console.log (Post.user);Viele Antworten hier sind keine guten Praktiken mehr oder erklären nichts mehr, deshalb schreibe ich das hier.
Grundlagen
Wenn der Rückruf von http.createServer aufgerufen wird, hat der Server tatsächlich alle Header für die Anforderung empfangen, aber es ist möglich, dass die Daten noch nicht empfangen wurden, sodass wir darauf warten müssen. Das http-Anforderungsobjekt (eine http.IncomingMessage-Instanz) ist tatsächlich ein lesbarer Stream . In lesbaren Streams wird bei jedem Eintreffen eines Datenblocks ein Ereignis ausgegeben (vorausgesetzt, Sie haben einen Rückruf registriert), und wenn alle Blöcke angekommen sind, wird ein Ereignis ausgegeben. Hier ist ein Beispiel, wie Sie die Ereignisse anhören:
data
end
Puffer in Strings konvertieren
Wenn Sie dies versuchen, werden Sie feststellen, dass die Chunks Puffer sind . Wenn Sie nicht mit Binärdaten arbeiten und stattdessen mit Zeichenfolgen arbeiten müssen, empfehle ich die Verwendung von request.setEncoding Methode, die bewirkt, dass der Stream Zeichenfolgen , die mit der angegebenen Codierung interpretiert werden, und Multi-Byte-Zeichen ordnungsgemäß verarbeitet.
Chunks puffern
Jetzt interessieren Sie sich wahrscheinlich nicht für jeden Block für sich. In diesem Fall möchten Sie ihn wahrscheinlich wie folgt puffern:
Hier wird Buffer.concat verwendet, das einfach alle Puffer verkettet und einen großen Puffer zurückgibt . Sie können auch das Concat-Stream-Modul verwenden, das dasselbe tut:
Analysieren von Inhalten
Wenn Sie versuchen , HTML - Formulare POST Vorlage ohne Dateien oder Gabe zu akzeptieren jQuery Ajax - Anrufe mit dem Standardinhaltstyp, dann ist der Inhaltstyp
application/x-www-form-urlencoded
mituft-8
Codierung. Sie können das Querystring-Modul verwenden, um es zu de-serialisieren und auf die Eigenschaften zuzugreifen:Wenn Ihr Inhaltstyp stattdessen JSON ist, können Sie einfach JSON.parse anstelle von qs.parse verwenden .
Wenn Sie sich mit Dateien beschäftigen oder mit mehrteiligen Inhaltstypen umgehen, sollten Sie in diesem Fall so etwas wie beeindruckend verwenden, das alle Schmerzen beim Umgang damit beseitigt. Schauen Sie sich diese andere Antwort von mir an, in der ich hilfreiche Links und Module für mehrteilige Inhalte veröffentlicht habe.
Rohrleitungen
Wenn Sie den Inhalt nicht analysieren, sondern an eine andere Stelle weitergeben möchten, z. B. als Daten an eine andere http-Anforderung senden oder in einer Datei speichern möchten, empfehle ich, ihn weiterzuleiten, anstatt ihn zu puffern, da er geringer ist Code, behandelt den Gegendruck besser, benötigt weniger Speicher und ist in einigen Fällen schneller.
Wenn Sie den Inhalt in einer Datei speichern möchten:
Begrenzung der Datenmenge
Wie andere Antworten bereits festgestellt haben, sollten Sie bedenken, dass böswillige Clients Ihnen möglicherweise eine große Datenmenge senden, um Ihre Anwendung zum Absturz zu bringen oder Ihren Speicher zu füllen, um sicherzustellen, dass Sie Anfragen löschen, die Daten ausgeben, die ein bestimmtes Limit überschreiten. Wenn Sie keine Bibliothek verwenden, um die eingehenden Daten zu verarbeiten. Ich würde vorschlagen, so etwas wie einen Stream-Meter zu verwenden, der die Anfrage abbrechen kann, wenn das angegebene Limit erreicht ist:
oder
oder
NPM-Module
Während ich oben beschrieben habe, wie Sie den HTTP-Anforderungshauptteil zum einfachen Puffern und Parsen des Inhalts verwenden können, schlage ich vor, eines dieser Module zu verwenden, anstatt es selbst zu implementieren, da sie wahrscheinlich Randfälle besser behandeln. Für Express empfehle ich Body-Parser . Für Koa gibt es ein ähnliches Modul .
Wenn Sie kein Framework verwenden, ist der Körper ziemlich gut.
quelle
request
wiederverwendet wird undrequest.on('end')
mehrmals aufgerufen wurde? Wie kann ich das vermeiden?request.on('end', ...)
aufgerufen wird.Hier ist ein sehr einfacher No-Framework-Wrapper, der auf den anderen hier veröffentlichten Antworten und Artikeln basiert:
Anwendungsbeispiel:
quelle
response.post
eher sein sollte als das logischererequest.post
. Ich habe den Beitrag aktualisiert.Es ist sauberer, wenn Sie Ihre Daten in JSON codieren und dann an Node.js senden.
quelle
qs.parse()
,JSON.parse()
drehte den Körper in etwas Brauchbares. Beispiel:var post = JSON.parse(body);
Dann greifen Sie mit auf die Daten zupost.fieldname
. (Moral der Geschichte, wenn Sie verwirrt sind über das, was Sie sehen, vergessen Sie nichttypeof
!)request.setEncoding
, damit dies ordnungsgemäß funktioniert. Andernfalls werden Nicht-ASCII-Zeichen möglicherweise nicht ordnungsgemäß verarbeitet.Für alle, die sich fragen, wie man diese triviale Aufgabe erledigt, ohne ein Webframework zu installieren, habe ich es geschafft, dies zusammenzufassen. Kaum produktionsbereit, aber es scheint zu funktionieren.
quelle
Sie können
body-parser
die Body-Parsing-Middleware von Node.js verwenden.Erste Ladung
body-parser
Ein Beispielcode
Weitere Dokumentation finden Sie hier
quelle
Referenz: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/
quelle
So können Sie es tun, wenn Sie Node-Formidable verwenden :
quelle
Wenn Sie reine Node.js bevorzugen, können Sie POST-Daten wie folgt extrahieren:
quelle
1)
'body-parser'
Von npm installieren .2) Dann in Ihrer App.ts.
3) dann musst du schreiben
im app.ts Modul
4) Denken Sie daran, dass Sie einschließen
oben oder vor einer Moduldeklaration.
Ex:
5) Dann verwenden
quelle
Wenn Sie Ihre Daten nicht zusammen mit dem
data
Rückruf aufteilen möchten, können Sie den Rückruf immer folgendermaßen verwendenreadable
:Dieser Ansatz ändert die eingehende Anfrage, aber sobald Sie Ihre Antwort beendet haben, wird die Anfrage durch Müll gesammelt, sodass dies kein Problem darstellen sollte.
Ein fortgeschrittener Ansatz wäre, zuerst die Körpergröße zu überprüfen, wenn Sie Angst vor riesigen Körpern haben.
quelle
request
ist ein normaler node.js-Stream, sodass Sierequest.headers
die Body-Länge überprüfen und die Anforderung bei Bedarf abbrechen können.Es gibt mehrere Möglichkeiten, dies zu tun. Der schnellste Weg, den ich kenne, ist jedoch die Verwendung der Express.js-Bibliothek mit Body-Parser.
Das kann für Zeichenfolgen funktionieren, aber ich würde stattdessen bodyParser.urlencoded in bodyParser.json ändern, wenn die POST-Daten ein JSON-Array enthalten.
Weitere Informationen: http://www.kompulsa.com/how-to-accept-and-parse-post-requests-in-node-js/
quelle
Sie müssen die
POST
Daten in Blöcken mit empfangenrequest.on('data', function(chunk) {...})
Sie sollten in Betracht ziehen, an der angegebenen Position eine Größenbeschränkung hinzuzufügen, wie dies vorgeschlagen wird .
quelle
setTimeout
, der die Verbindung nach einer bestimmten Zeit beendet, wenn die vollständige Anforderung nicht in diesem Fenster empfangen wird.Express v4.17.0
quelle
Wenn Sie mit Express.js , bevor Sie auf die req.body zugreifen können, müssen Sie Middleware bodyParser hinzufügen:
Dann können Sie fragen
quelle
Und wenn Sie nicht das gesamte Framework wie Express verwenden möchten, sondern auch verschiedene Arten von Formularen benötigen, einschließlich Uploads, ist Formalin möglicherweise eine gute Wahl.
Es ist in den Modulen von Node.j aufgeführt
quelle
Ich habe ein Video gefunden, in dem erklärt wird, wie dies erreicht werden kann: https://www.youtube.com/watch?v=nuw48-u3Yrg
Es verwendet das Standardmodul "http" zusammen mit den Modulen "querystring" und "stringbuilder". Die Anwendung nimmt zwei Zahlen (unter Verwendung von zwei Textfeldern) von einer Webseite und gibt beim Senden die Summe dieser beiden zurück (zusammen mit dem Beibehalten der Werte in den Textfeldern). Dies ist das beste Beispiel, das ich irgendwo anders finden könnte.
Zugehöriger Quellcode:
quelle
Für diejenigen, die einen rohen binären POST-Upload ohne Codierungsaufwand verwenden, können Sie Folgendes verwenden:
Klient:
Server:
quelle
Sie können die Express- Middleware verwenden, in die jetzt ein Body-Parser integriert ist. Dies bedeutet, dass Sie lediglich Folgendes tun müssen:
Dieses Codebeispiel ist ES6 mit Express 4.16.x.
quelle
Sie können Post-Parameter ohne Express extrahieren.
1:
nmp install multiparty
2: Mehrparteien importieren. wie
var multiparty = require('multiparty');
3: `
4: und HTML FORM IS.
Ich hoffe das wird für dich funktionieren. Vielen Dank.
quelle
Begrenzen Sie die POST-Größe und vermeiden Sie eine Überflutung Ihrer Knoten-App. Es gibt eine große Roh-Körper - Modul, geeignet sowohl für Express- und verbinden, die Sie nach Größe und Länge begrenzen Anfrage helfen können.
quelle
Wenn es sich um einen Datei-Upload handelt, sendet der Browser ihn normalerweise als
"multipart/form-data"
Inhaltstyp. Sie können dies in solchen Fällen verwendenReferenz 1
Referenz 2
quelle
Auf Formularfeldern wie diesen
Einige der oben genannten Antworten schlagen fehl, da sie nur flache Daten unterstützen.
Im Moment verwende ich die Casey Chu-Antwort, aber mit dem "qs" anstelle des "querystring" -Moduls. Dies ist auch das Modul, das "Body-Parser" verwendet. Wenn Sie also verschachtelte Daten möchten, müssen Sie qs installieren.
Ersetzen Sie dann die erste Zeile wie folgt:
quelle
Sie können die POST-Anfrage einfach senden und abrufen, indem Sie "Request - Simplified HTTP Client" und Javascript Promise verwenden.
quelle
Sie müssen bodyParser () verwenden, wenn die Formulardaten in req.body verfügbar sein sollen. body-parser analysiert Ihre Anfrage und konvertiert sie in ein Format, aus dem Sie auf einfache Weise relevante Informationen extrahieren können, die Sie möglicherweise benötigen.
Angenommen, Sie haben ein Anmeldeformular an Ihrem Frontend. Sie füllen es aus und fordern den Server auf, die Details irgendwo zu speichern.
Das Extrahieren von Benutzername und Passwort aus Ihrer Anfrage ist so einfach wie unten, wenn Sie Body-Parser verwenden.
………………………………………………….
quelle
EIN LINER ohne MIDDLEWARE
Wenn Sie folgende Daten veröffentlichen,
'name':'ABC'
können Sie diese mit dem folgenden Liner analysieren:
quelle