Si vous utilisez Express (développement Web haute performance et haut de gamme pour Node.js), vous pouvez le faire:
HTML:
<form method="post" action="/">
<input type="text" name="user[name]">
<input type="text" name="user[email]">
<input type="submit" value="Submit">
</form>
Client API:
fetch('/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
user: {
name: "John",
email: "[email protected]"
}
})
});
Node.js: (depuis 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: (pour 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());
.Vous pouvez utiliser le
querystring
module:Maintenant, par exemple, si vous avez un
input
champ avec un nomage
, vous pouvez y accéder en utilisant la variablepost
:la source
var POST = qs.parse(body); // use POST
uniquement pour les noobs comme moi: lorsque le nom du champ de texte saisi est "utilisateur",Post.user
affichera les données de ce champ. par exempleconsole.log(Post.user);
readable
rappel au lieu de créer les données dans une chaîne de corps. Une fois tiré, le corps est disponible viarequest.read();
req.connection.destroy();
n'empêche pas l'exécution des rappels! Par exemple, le rappel "à la fin" sera exécuté avec le corps tronqué! Ce n'est probablement pas ce que vous voulez ...Assurez-vous de couper la connexion si quelqu'un essaie d'inonder votre RAM!
la source
var POST = qs.parse(body); // use POST
uniquement pour les noobs: lorsque le nom du champ de texte saisi est "utilisateur", Post.user affichera les données de ce champ. par exemple console.log (Post.user);Beaucoup de réponses ici ne sont plus de bonnes pratiques ou n'expliquent rien, c'est pourquoi j'écris ceci.
Les bases
Lorsque le rappel de http.createServer est appelé, c'est lorsque le serveur a effectivement reçu tous les en-têtes de la demande, mais il est possible que les données n'aient pas encore été reçues, nous devons donc l'attendre. L' objet de requête http (une instance http.IncomingMessage) est en fait un flux lisible . Dans les flux lisibles chaque fois qu'un bloc de données arrive, un événement est émis (en supposant que vous y avez enregistré un rappel) et lorsque tous les blocs sont arrivés, un événement est émis. Voici un exemple sur la façon dont vous écoutez les événements:
data
end
Conversion de tampons en chaînes
Si vous essayez ceci, vous remarquerez que les morceaux sont des tampons . Si vous ne traitez pas avec des données binaires et devez travailler avec des chaînes à la place, je suggère d'utiliser la méthode request.setEncoding qui provoque l'émission de chaînes interprétées avec le codage donné et gère correctement les caractères multi-octets.
Morceaux tampons
Maintenant, vous n'êtes probablement pas intéressé par chaque morceau par lui-même, donc dans ce cas, vous voulez probablement le tamponner comme ceci:
Ici Buffer.concat est utilisé, qui concatène simplement tous les tampons et retourne un gros tampon. Vous pouvez également utiliser le module concat-stream qui fait de même:
Analyse du contenu
Si vous essayez d'accepter la soumission POST de formulaires HTML sans fichier ou de passer des appels jQuery ajax avec le type de contenu par défaut, le type de contenu est
application/x-www-form-urlencoded
avecuft-8
codage. Vous pouvez utiliser le module querystring pour le désérialiser et accéder aux propriétés:Si votre type de contenu est JSON à la place, vous pouvez simplement utiliser JSON.parse au lieu de qs.parse .
Si vous traitez des fichiers ou manipulez un type de contenu en plusieurs parties, alors dans ce cas, vous devez utiliser quelque chose comme formidable qui enlève toute la douleur de le traiter. Jetez un oeil à cette autre réponse à moi où j'ai publié des liens et des modules utiles pour le contenu en plusieurs parties.
Tuyauterie
Si vous ne voulez pas analyser le contenu mais plutôt le transmettre ailleurs, par exemple l'envoyer à une autre requête http en tant que données ou l'enregistrer dans un fichier, je suggère de le canaliser plutôt que de le mettre en mémoire tampon, car ce sera moins code, gère mieux la contre-pression, cela prendra moins de mémoire et dans certains cas plus rapidement.
Donc, si vous souhaitez enregistrer le contenu dans un fichier:
Limiter la quantité de données
Comme d'autres réponses l'ont noté, gardez à l'esprit que les clients malveillants peuvent vous envoyer une énorme quantité de données pour bloquer votre application ou remplir votre mémoire afin de vous assurer que vous supprimez les demandes qui émettent des données dépassent une certaine limite. Si vous n'utilisez pas de bibliothèque pour gérer les données entrantes. Je suggère d'utiliser quelque chose comme stream-meter qui peut abandonner la demande s'il atteint la limite spécifiée:
ou
ou
Modules NPM
Alors que j'ai décrit ci-dessus comment utiliser le corps de la requête HTTP, pour simplement mettre en mémoire tampon et analyser le contenu, je suggère d'utiliser l'un de ces modules plutôt que de l'implémenter par vous-même car ils traiteront probablement mieux les cas marginaux. Pour exprimer, je suggère d'utiliser l' analyseur corporel . Pour koa, il existe un module similaire .
Si vous n'utilisez pas de framework, le corps est assez bon.
la source
request
soit réutilisée et qu'ellerequest.on('end')
soit invoquée plusieurs fois? Comment puis-je éviter cela?request.on('end', ...)
sera appelé.Voici un wrapper sans cadre très simple basé sur les autres réponses et articles publiés ici:
Exemple d'utilisation:
la source
response.post
plutôt que le plus logiquerequest.post
. J'ai mis à jour le message.Il sera plus propre si vous encodez vos données en JSON , puis envoyez-les à Node.js.
la source
qs.parse()
, aJSON.parse()
transformé le corps en quelque chose utilisable. Exemple:,var post = JSON.parse(body);
puis accédez aux données avecpost.fieldname
. (Morale de l'histoire, si vous êtes confus au sujet de ce que vous voyez, n'oubliez pastypeof
!)request.setEncoding
pour faire fonctionner correctement sinon il pourrait ne pas gérer correctement les caractères non ascii.Pour tous ceux qui se demandent comment faire cette tâche insignifiante sans installer de cadre Web, j'ai réussi à le faire ensemble. À peine prêt pour la production mais il semble fonctionner.
la source
Vous pouvez utiliser
body-parser
le middleware d'analyse du corps Node.js.Première charge
body-parser
Un exemple de code
Plus de documentation peut être trouvée ici
la source
Référence: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/
la source
Voici comment vous pouvez le faire si vous utilisez node-formidable :
la source
Si vous préférez utiliser Node.js pur, vous pouvez extraire les données POST comme indiqué ci-dessous:
la source
1) Installez à
'body-parser'
partir de npm.2) Puis dans votre app.ts
3) alors vous devez écrire
dans le module app.ts
4) Gardez à l'esprit que vous incluez
en haut ou avant toute déclaration de module.
Ex:
5) Ensuite, utilisez
la source
Si vous ne voulez pas segmenter vos données avec le
data
rappel, vous pouvez toujours utiliser lereadable
rappel comme ceci:Cette approche modifie la demande entrante, mais dès que vous avez terminé votre réponse, la demande sera récupérée, ce qui ne devrait pas poser de problème.
Une approche avancée serait de vérifier d'abord la taille du corps, si vous avez peur des corps énormes.
la source
request
est un flux node.js normal, vous pouvez donc vérifier larequest.headers
longueur du corps et annuler la demande si nécessaire.Il existe plusieurs façons de procéder. Cependant, le moyen le plus rapide que je connaisse est d'utiliser la bibliothèque Express.js avec body-parser.
Cela peut fonctionner pour les chaînes, mais je changerais plutôt bodyParser.urlencoded en bodyParser.json si les données POST contiennent un tableau JSON.
Plus d'informations: http://www.kompulsa.com/how-to-accept-and-parse-post-requests-in-node-js/
la source
Vous devez recevoir les
POST
données par blocs en utilisantrequest.on('data', function(chunk) {...})
Vous devriez envisager d'ajouter une limite de taille à la position indiquée comme l' a suggéré le jh .
la source
setTimeout
qui met fin à la connexion après un certain laps de temps, si la demande complète n'est pas reçue dans cette fenêtre.Express v4.17.0
la source
Si vous utilisez Express.js , avant de pouvoir accéder à req.body, vous devez ajouter le middleware bodyParser:
Ensuite, vous pouvez demander
la source
Et si vous ne souhaitez pas utiliser l'intégralité du framework comme Express, mais vous avez également besoin de différents types de formulaires, y compris les téléchargements, puis formelle peut être un bon choix.
Il est répertorié dans les modules Node.js
la source
J'ai trouvé une vidéo qui explique comment y parvenir: https://www.youtube.com/watch?v=nuw48-u3Yrg
Il utilise le module "http" par défaut avec les modules "querystring" et "stringbuilder". L'application prend deux nombres (en utilisant deux zones de texte) à partir d'une page Web et lors de la soumission, retourne la somme de ces deux (ainsi que la persistance des valeurs dans les zones de texte). C'est le meilleur exemple que j'ai pu trouver ailleurs.
Code source associé:
la source
Pour ceux qui utilisent le téléchargement POST binaire brut sans surcharge de codage, vous pouvez utiliser:
client:
serveur:
la source
Vous pouvez utiliser le middleware express , qui contient désormais un analyseur de corps. Cela signifie que tout ce que vous devez faire est le suivant:
Cet exemple de code est ES6 avec Express 4.16.x
la source
vous pouvez extraire le paramètre post sans utiliser express.
1:
nmp install multiparty
2: importation multipartite. comme
var multiparty = require('multiparty');
3: `
4: ET LE FORMULAIRE HTML EST.
J'espère que cela fonctionnera pour vous. Merci.
la source
Limitez la taille du POST pour éviter d'inonder votre application de nœud. Il existe un excellent module de corps brut , adapté à la fois à l'express et à la connexion, qui peut vous aider à limiter la demande par taille et longueur.
la source
S'il s'agit d'un téléchargement de fichier, le navigateur l'envoie généralement en tant que
"multipart/form-data"
type de contenu. Vous pouvez l'utiliser dans de tels casRéférence 1
Référence 2
la source
Sur des champs de formulaire comme ceux-ci
certaines des réponses ci-dessus échoueront car elles ne prennent en charge que les données plates.
Pour l'instant j'utilise la réponse Casey Chu mais avec le "qs" au lieu du module "querystring". C'est également le module "body-parser" . Donc, si vous voulez des données imbriquées, vous devez installer qs.
Remplacez ensuite la première ligne comme:
la source
Vous pouvez facilement envoyer et obtenir la réponse de la demande POST en utilisant "Demande - Client HTTP simplifié" et Javascript Promise.
la source
Vous devez utiliser bodyParser () si vous souhaitez que les données du formulaire soient disponibles dans req.body. body-parser analyse votre demande et la convertit en un format à partir duquel vous pouvez facilement extraire les informations pertinentes dont vous pourriez avoir besoin.
Par exemple, supposons que vous ayez un formulaire d'inscription à votre frontend. Vous le remplissez et demandez au serveur de sauvegarder les détails quelque part.
Extraire le nom d'utilisateur et le mot de passe de votre demande est aussi simple que ci-dessous si vous utilisez l'analyseur corporel.
…………………………………………………….
la source
ONE LINER sans MIDDLEWARE
Si vous publiez les données suivantes,
'name':'ABC'
vous pouvez ensuite les analyser en utilisant la ligne suivante,
la source