Kaip gauti POST užklausos parametrus?

Čia yra mano paprasta forma:

Express.js /Node.js“ kodas: 

 app.post('/userlogin', function(sReq, sRes){ var email = sReq.query.email.; } 

Bandžiau sReq.query.email arba sReq.query['email'] arba sReq.params['email'] ir tt Nė vienas iš jų neveikia. Jie visi grįžta undefined .

Kai persijungiu į skambutį, jis veikia, taigi ... bet kokia idėja?

558
19 апр. nustatyti murvinlai 19 bal . 2011-04-19 03:38 '11 at 3:38 2011-04-19 03:38
@ 16 atsakymų

Viskas pasikeitėExpress 4.0“ :

 $ npm install --save body-parser 

ir tada:

 var bodyParser = require('body-parser') app.use( bodyParser.json() ); // to support JSON-encoded bodies app.use(bodyParser.urlencoded({ // to support URL-encoded bodies extended: true })); 

Likusi dalis yra panaši į „ Express 3.0“ :

Pirma, jums reikia pridėti keletą tarpinių programų, kad būtų galima analizuoti pranešimo duomenis.

Pridėkite vieną arba abi toliau nurodytas kodo eilutes:

 app.use(express.json()); // to support JSON-encoded bodies app.use(express.urlencoded()); // to support URL-encoded bodies 

Tada jūsų tvarkytoju naudokite objektą req.body :

 // assuming POST: name=foo <-- URL encoding // // or POST: {"name":"foo","color":"red"} <-- JSON encoding app.post('/test-page', function(req, res) { var name = req.body.name, color = req.body.color; // ... }); 

Atkreipkite dėmesį, kad naudojant express.bodyParser() nėra rekomenduojama.

 app.use(express.bodyParser()); 

... yra lygiavertis:

 app.use(express.json()); app.use(express.urlencoded()); app.use(express.multipart()); 

Saugumo problemos egzistuoja su express.multipart() , todėl geriausia aiškiai remti reikalingo tipo (-ų) tipo (-ų) palaikymą. Jei jums reikia kelių simbolių kodavimo (pvz., Norint paremti failų įkėlimą), turėtumėte tai perskaityti .

921
17 авг. Drew Noakes rugpjūčio 17 d. Atsakymas 2012-08-17 18:30 „12, 18:30, 2012-08-17 18:30

Pastaba : šis atsakymas yra skirtas „Express 2“.

Jei naudojate „connect / express“, turite naudoti „ bodyParser“ tarpinę programinę įrangą : tai aprašyta „ Expressjs“ vadove .

 // example using express.js: var express = require('express') , app = express.createServer(); app.use(express.bodyParser()); app.post('/', function(req, res){ var email = req.param('email', null); // second parameter is default }); 

Čia yra pirminė ryšio versija:

 // example using just connect var connect = require('connect'); var url = require('url'); var qs = require('qs'); var server = connect( connect.bodyParser(), connect.router(function(app) { app.post('/userlogin', function(req, res) { // the bodyParser puts the parsed request in req.body. var parsedUrl = qs.parse(url.parse(req.url).query); var email = parsedUrl.email || req.body.email;; }); }) ); 

Iteracija ir kūnas analizuojami naudojant „ Rails Style“ ( qs ) stiliaus parametrų apdorojimą , o ne žemo lygio bibliotekos querystring . Norint išanalizuoti qs parametrus naudojant qs parametras turi turėti skliaustelius: name[]=val1> . Jis taip pat palaiko įdėtus žemėlapius. Be HTML formų reprezentacijų analizavimo, bodyParser gali automatiškai analizuoti JSON užklausas.

Keisti . Aš perskaičiau „express.js“ ir pakeitiau savo atsakymą, kad „Express“ naudotojai būtų labiau natūralūs.

75
19 апр. Atsakyti yonran 19 Bal 2011-04-19 05:21 '11 at 5:21 am 2011-04-19 05:21

Su Express.bodyParser () funkcija susijusi saugos problema

Nors visi kiti atsakymai šiuo metu rekomenduoja naudoti „ express.bodyParser() , tai iš tikrųjų yra „ express.json() , express.urlencoded() ir express.multipart() ( http: // expressjs .com / api.html (bodyParser ). express.urlencoded() formų užklausų analizė atliekama naudojant express.urlencoded() tarpinę programinę įrangą ir viską, ko jums reikia, kad atskleistumėte formos duomenis apie req.body objektą.

Dėl saugumo problemos, kai express.multipart() / connect.multipart() sukuria laikinus failus visiems atsisiunčiamiems failams (ir nerenka šiukšlių), dabar rekomenduojama nenaudoti „ express.bodyParser() pakuotės, bet vietoj to tik tie vidurkiai, kurių jums reikia.

Pastaba connect.bodyParser() netrukus bus atnaujintas, kad būtų įtrauktas tik urlencoded ir json kai bus json Connect 3.0 (Express pratęsimas).


Taigi, trumpai tariant, ...

 app.use(express.bodyParser()); 

... turite naudoti

 app.use(express.urlencoded()); app.use(express.json()); // if needed 

ir, jei / kai jums reikia tvarkyti daugiapartines formas (failų įkėlimus), naudokite trečiosios šalies biblioteką ar tarpinę programinę įrangą, pvz., daugiašalę, „busboy“, „dicer“ ir kt.

68
22 нояб. Atsakymą pateikė Sean Lynch lapkričio 22 d. 2013-11-22 01:00 '13, 01:00 2013-11-22 01:00

Tai bus daroma, jei norite sukurti prieglobos užklausą be tarpinės programinės įrangos:

 app.post("/register/",function(req,res){ var bodyStr = ''; req.on("data",function(chunk){ bodyStr += chunk.toString(); }); req.on("end",function(){ res.send(bodyStr); }); }); 

Jis išsiųs jį į naršyklę.

 email=emailval> 

Tikriausiai geriau naudoti tarpinę programinę įrangą, nors jums nereikia vėl ir vėl rašyti kiekviename maršrute.

21
22 июля '14 в 5:19 2014-07-22 05:19 atsakymas pateikiamas med116 liepos 22 d. 14, 5:19 2014-07-22 05:19

Pastaba „Express 4“ naudotojams:

Jei bandote įdėti app.use(express.bodyParser()); Savo programoje bandant paleisti „Express“ serverį gausite šią klaidą:

Klaida Dauguma „middlewares“ (pvz., „BodyParser“) nebėra susiję su „Express“ ir turi būti įdiegti atskirai. Žr. Https://github.com/senchalabs/connect#middleware .

Turėsite įdiegti body-parser paketą atskirai nuo npm ir tada naudoti kažką panašaus (pvz., Pavyzdys paimtas iš „ GitHub“ puslapio ):

 var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser()); app.use(function (req, res, next) { console.log(req.body) // populated! next(); }) 
20
10 мая '14 в 23:52 2014-05-10 23:52 atsakymas pateikiamas mplewis gegužės 10 d., 14 val

Tam tikra forma:

 <form action='/somepath' method='post'> <input type='text' name='name'></input> </form> 

Išraiškos naudojimas

 app.post('/somepath', function(req, res) { console.log(JSON.stringify(req.body)); console.log('req.body.name', req.body['name']); }); 

Išvada:

 {"name":"x","description":"x"} req.param.name x 
16
20 янв. Atsakymas duotas Dovydui 20 Jan 2012-01-20 14:12 '12 12:12 pm 2012-01-20 14:12
 app.use(express.bodyParser()); 

Tada „ app.post užklausai galite gauti įrašų vertes per „ req.body.{post request variable} .

15
09 апр. atsakymas pateikiamas Chinthaka 09 balandžio. 2012-04-09 22:18 '12 10:18 val. 2012-04-09 22:18

„Express“ naujinimas 4.4.1

Iš „Express“ ištrinama:

  • bodyParser
  • Json
  • urlencoded
  • kelių dalių

Kai naudojate tarpinę programinę įrangą, kaip ir 3.0 versijoje. Gausite šią klaidą:

 Error: Most middleware (like urlencoded) is no longer bundled with Express and must be installed separately. 


Kad galėtumėte naudoti šią tarpinę programinę įrangą, kiekvienai tarpinei programinei įrangai reikia atskirai npm .

Kadangi bodyParser yra pažymėtas kaip pasenęs, todėl rekomenduoju tokį būdą, kaip „json“, „urlencode“ ir daugiapartinę analizę naudoti kaip didžiulį ryšį-daugiapartę. („Multi-page“ tarpinė programinė įranga taip pat yra pasenusi).

Taip pat nepamirškite, kad paprasčiausiai apibrėždami urlencode + json, šios formos nebus analizuojamos, o req.body bus neapibrėžta. Norint gauti daugelio puslapių užklausą, turite nustatyti tarpinės programinės įrangos tvarkyklę.

 var urlencode = require('urlencode'); var json = require('json-middleware'); var multipart = require('connect-multiparty'); var multipartMiddleware = multipart(); app.use(json); app.use(urlencode); app.use('/url/that/accepts/form-data', multipartMiddleware); 
13
12 июня '14 в 7:13 2014-06-12 07:13 atsakymas pateikiamas Yeelan birželio 12, 14, 7:13 2014-06-12 07:13

Backend:

 import express from 'express'; import bodyParser from 'body-parser'; const app = express(); app.use(bodyParser.json()); // add a middleware (so that express can parse request.body json) app.post('/api/courses', (request, response) => { response.json(request.body); }); 

Frontendas:

 fetch("/api/courses", { method: 'POST', body: JSON.stringify({ hi: 'hello' }), // stringify JSON headers: new Headers({ "Content-Type": "application/json" }); // add headers }); 
7
05 авг. atsakymas pateikiamas 05 rugpjūčio mėn . 2016-08-05 21:05 '16 at 9:05 pm 2016-08-05 21:05

„Express 4.1“ ir naujesnės versijos

Kadangi dauguma atsakymų yra naudojami „Express“, „bodyParser“, prijunkite; kur daugiapartė yra pasenusi. Yra saugus būdas siųsti post-part objektus.

„Multer“ gali būti naudojamas kaip „connect.multipart“ () pakeitimas.

Norėdami įdiegti paketą

 $ npm install multer 

Atsisiųskite jį į savo programą:

 var multer = require('multer'); 

Ir tada pridėkite ją prie tarpinės programinės įrangos stekų kartu su kita oficialiąja tarpinės analizės programa.

 app.use(express.json()); app.use(express.urlencoded()); app.use(multer({ dest: './uploads/' })); 

connect.json () apdoroja taikomąją programą

connect.urlencoded () apdoroja programą / x -www-form-urlencoded

multer () apdoroja daugiapartinius / formos duomenis

7
30 авг. Atsakymą pateikė Lalit Umbarkar 30 rug . 2015-08-30 13:37 '15, 13:37 pm 2015-08-30 13:37

Aš ieškojau šios tikslios problemos. Aš sekiau visus aukščiau pateiktus patarimus, tačiau req.body vis dar grįžo tuščią {} objektą. Mano atveju tai buvo taip paprasta, kaip html buvo neteisinga.

Savo html formoje įsitikinkite, kad įvesties žymėse naudojate atributą 'name' , o ne tik 'id' . Priešingu atveju nėra analizuojama nieko.

 <input id='foo' type='text' value='1'/> // req = {} <input id='foo' type='text' name='foo' value='1' /> // req = {foo:1} 

Mano idiotinė klaida yra tavo gera.

6
18 нояб. atsakymas pateikiamas cwingrav 18 nov. 2016-11-18 17:20 '16 at 17:20 pm 2016-11-18 17:20

Nenaudojate „ app.use“ (express.bodyParser ()) . „BodyParser“ yra „Json + urlencoded + mulitpart“ sąjunga. Nenaudojate to, nes ryšys su 3.0 dalis bus pašalintas.

Norėdami išspręsti šią problemą, galite tai padaryti:

 app.use(express.json()); app.use(express.urlencoded()); 

Labai svarbu žinoti, kad „ app.use“ („app.router“) turėtų būti naudojamas po „Json“ ir „urlencoded“, kitaip jis neveiks!

5
18 февр. HenioJR atsakymas, pateiktas vasario 18 d. 2014-02-18 16:52 '14 at 16:52 2014-02-18 16:52

Visus parametrus galėčiau rasti naudojant šį kodą POST ir GET užklausoms.

2
21 сент. Atsakymas pateikiamas ARUNBALAN NV 21 rugsėjis. 2016-09-21 16:08 '16, 16:08 pm 2016-09-21 16:08

Darbas su užklausos paslauga man

 req.on('end', function() { var paramstring = postdata.split(" }); var postdata = ""; req.on('data', function(postdataChunk){ postdata += postdataChunk; }); 
2
29 апр. atsakymas pateikiamas iki balandžio 29 d. 2015-04-29 21:01 '15, 21:01, 2015-04-29 21:01
 Post Parameters can be retrieved as follows- app.post('/api/v1/test',Testfunction); http.createServer(app).listen(port, function(){ console.log("Express server listening on port " + port) }); function Testfunction(request,response,next) { console.log(request.param("val1")); response.send('HI'); } 
0
11 окт. Hamidano atsakymas spalio 11 d 2017-10-11 18:30 '17, 18.30 val. 2017-10-11 18:30

naudoti „Express-fileupload“ paketą

 var app = require('express')(); var http = require('http').Server(app); const fileUpload = require('express-fileupload') app.use(fileUpload()); app.post('/', function(req, res) { var email = req.body.email; res.send('<h1>Email :</h1> '+email); }); http.listen(3000, function(){ console.log('Running Port:3000'); }); 
0
06 нояб. atsakymą pateikė Chiragas, lapkričio 6 d. 2017-11-06 16:46 '17 ne 4:46 2017-11-06 16:46

Kiti klausimai apie „ žymes arba „ Klauskite klausimą“