Node.js ve Express kullanarak POST yaparken istek gövdesine nasıl erişilir?


175

Aşağıdaki Node.js kodu var:

var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());

app.post('/', function(request, response) {
    response.write(request.body.user);
    response.end();
});

Şimdi ben böyle bir şey POST eğer:

curl -d user=Someone -H Accept:application/json --url http://localhost:5000

SomeoneBeklediğim gibi olsun . Şimdi, tüm istek gövdesini almak istersem ne olur? Ben denedim response.write(request.body)ama Node.js " ilk argüman bir dize veya Tampon olmalıdır " sonra bir istisna atar " gönderildikten sonra üstbilgi ayarlanamaz " diyor bir istisna ile bir "sonsuz döngü" gider ; bunu yapsam var reqBody = request.body;ve sonra yazsam da bu doğrudur response.write(reqBody).

Burada sorun ne?

Ayrıca, ham talebi kullanmadan alabilir express.bodyParser()miyim?


Görünüşe göre bir şey var response.write(reqBody); kullandığımda response.send(reqBody)işler iyi çalışıyor ... ve evet, response.endsonra kullanıyorum response.write.
TheBlueSky

Yanıtlar:


161

Express 4.0 ve üstü:

$ npm install --save body-parser

Ve sonra düğüm uygulamanızda:

const bodyParser = require('body-parser');
app.use(bodyParser);

Express 3.0 ve altı:

Bunu cURL çağrınızda iletmeyi deneyin:

--header "Content-Type: application/json"

ve verilerinizin JSON biçiminde olduğundan emin olun:

{"user":"someone"}

Ayrıca, nesnenin içindeki verileri aşağıdaki örnekte olduğu gibi görmek için node.js kodunuzdaki console.dir dosyasını kullanabilirsiniz:

var express = require('express');
var app = express.createServer();

app.use(express.bodyParser());

app.post('/', function(req, res){
    console.dir(req.body);
    res.send("test");
}); 

app.listen(3000);

Bu diğer soru da yardımcı olabilir: Express node.js POST isteğinde JSON nasıl alınır?

BodyParser'ı kullanmak istemiyorsanız şu diğer soruyu inceleyin: https://stackoverflow.com/a/9920700/446681


Kullanmayı denedim curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000ama bana " Beklenmedik simge u " hatası veriyor , bu yüzden orijinal yazımda belirtilen çağrıya geçtim.
TheBlueSky


40
express.bodyParser()Express 4.x'te kullanımdan kaldırıldı. Kullanım npmjs.org/package/body-parser yerine.
Luc

@TheBlueSky "Beklenmedik simge u" nuzun var olmasının nedeni, kabuğun çift tırnaklarınızı tüketmesiydi. Aynı şey yaparsanız da olur echo any"thing". Gönderdiğiniz veriler bunun olmasını önlemek için tırnak içinde olmalıdır.
Tom Fenech

11
Express 4.16.0 veya üstü sürümlerde app.use () öğesinde express.json () yöntemi bu şekilde => app.use (express.json ()) kullanılabilir;
Mitro

187

Express v4.16'dan başlayarak herhangi bir ek modüle gerek yoktur, sadece dahili JSON ara katman yazılımını kullanın :

app.use(express.json())

Bunun gibi:

const express = require('express')

app.use(express.json())    // <==== parse request body as JSON

app.listen(8080)

app.post('/test', (req, res) => {
  res.json({requestBody: req.body})  // <==== req.body will be a parsed JSON object
})

Not - body-parser, buna bağlıdır, eksprese zaten dahil edilmiştir.

Ayrıca başlığı göndermeyi de unutmayın Content-Type: application/json


14
Teşekkür ederim, bu 4.16+ için en iyi cevap. Başka hiçbir bağımlılık ve bir cazibe gibi çalışır!
codepleb

1
Vücut ayrıştırıcıya ihtiyaç duymadığını bulabildiğim en iyi / tek çözüm
Mote Zart

41

Express 4'ten itibaren, aşağıdaki kod hile yapıyor gibi görünüyor. body-parserKullanarak yüklemeniz gerekeceğini unutmayın npm.

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));


app.listen(8888);

app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});

29
Json cisimlerini ayrıştırmak için aşağıdaki satırı eklemeniz gerekirapp.use(bodyParser.json())
Camilo Silva

1
@ cml.co herhangi bir neden yoktur app.use(bodyParser.urlencoded({ extended: true })edilir de gerekli? İstekte JSON olarak oldukça karmaşık bir belge gönderiyorum ve extended: falseişe yaramadı. Yalnızca true olarak ayarladığımda istek doğru şekilde ayrıştırılıyor.
Web Kullanıcısı

3
Sadece bir not. NodeJS ve Express ile bir AWS Linux sunucu kurulumunda json verileri almak için app.use(bodyParser.urlencoded({ extended: true }));AND kullanmak app.use(bodyParser.json())zorunda kaldım.
David

24
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())

var port = 9000;

app.post('/post/data', function(req, res) {
    console.log('receiving data...');
    console.log('body is ',req.body);
    res.send(req.body);
});

// start the server
app.listen(port);
console.log('Server started! At http://localhost:' + port);

Bu sana yardım edecek. Sanırım bedenini json olarak gönderiyorsun.


Ben her zaman bodyParser.json () bit x_x eklemeyi unutmayın!
Jonny Asmar

14

2019 için yüklemenize gerek yok body-parser.

Kullanabilirsiniz:

var express = require('express');
var app = express();
app.use(express.json())
app.use(express.urlencoded({extended: true}))
app.listen(8888);
app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});

8

Bu olmadan elde edilebilir body-parserde dinlerken bağımlılık request:datave request:endistek ucundaki tepkisini dönmek kod örneğini aşağıda bakın. ref: https://nodejs.org/tr/docs/guides/anatomy-of-an-http-transaction/#request-body

var express = require('express');
var app = express.createServer(express.logger());

app.post('/', function(request, response) {

    // push the data to body
    var body = [];
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      // on end of data, perform necessary action
      body = Buffer.concat(body).toString();
      response.write(request.body.user);
      response.end();
    });
});

3

Bunu dene:

response.write(JSON.stringify(request.body));

Bu, bodyParsersizin için oluşturulan nesneyi alıp bir dizgiye geri döndürür ve yanıta yazar. Tam istek gövdesini (aynı boşluk, vb. İle) istiyorsanız, daha önce isteğe bağlı datave enddinleyicilere ihtiyacınız olacak ve bağlantıdan gelen json ayrıştırma kaynak kodunda gördüğünüz gibi yığın tarafından dize yığınını oluşturacaksınız .


1

"Yapmaya çalıştığınızı" iddia ettiğiniz şey, tam olarak curl ile çağırdığınızda "beklendiği gibi" çalışan kodda yazdığınız şeydir.

Aldığınız hata, bize gösterdiğiniz kodların hiçbiriyle ilişkili görünmüyor.

Ham isteği almak istiyorsanız request, datave endolayları için işleyicileri ayarlayın (ve tabii ki tüm çağrılarını kaldırın express.bodyParser()). O Not dataolaylar parçalar halinde meydana gelecek ve sizin için bir kodlama ayarlamak sürece, söz konusu dataolayın bu parçalar tamponlar, değil dizeleri olacaktır.


kopyala-yapıştır hatasıydı; Demek istedim, istemedim request.bodyve request.body.userşimdi düzelttim. Bu arada, var reqBody = request.body;oldu ve hala doğru ve denediğinizde ben alıyorum hata alırsınız. Her neyse, işleyiciyi açmayla ilgili bir örnek verebilir misiniz request; Ekspres rehberde bulamıyorum.
TheBlueSky

1

Gönderi verilerinin parçalarını okuyacak kadar tembelseniz. json okumak için aşağıdaki satırları yapıştırmanız yeterlidir.

Aşağıda TypeScript için benzer JS için de yapılabilir.

app.ts

 import bodyParser from "body-parser";
 // support application/json type post data
 this.app.use(bodyParser.json());
 // support application/x-www-form-urlencoded post data
 this.app.use(bodyParser.urlencoded({ extended: false }));

POST çağrısı alan herhangi bir denetleyicinizden birinde aşağıda gösterildiği gibi kullanın

userController.ts

 public async POSTUser(_req: Request, _res: Response) {
   try {
          const onRecord = <UserModel>_req.body;
           /* Your business logic */
           _res.status(201).send("User Created");
        }
    else{
           _res.status(500).send("Server error");
           }        
   };

_req.body, TS Modelinize json verilerini ayrıştırıyor olmalıdır.


1
İnsanları, tembel olarak arayarak cevabınızı kullanmaya teşvik etmeye veya cesaretlendirmeye çalıştığınızdan emin değilim :)
TheBlueSky

1

JS ve ES için kesinlikle yeniyim, ama benim için işe yarayan şey sadece bu:

JSON.stringify(req.body)

Yanlış bir şey olup olmadığını bana bildirin!


tam olarak ihtiyacım olan şey
Josef Henn

0

Body Parser'ı aşağıdaki komutla yükleyin

$ npm install --save body-parser

Gövde Ayrıştırıcısını Yapılandırma

const bodyParser = require('body-parser');
app.use(bodyParser);
app.use(bodyParser.json()); //Make sure u have added this line
app.use(bodyParser.urlencoded({ extended: false }));

-3

Kayıt verilerini günlüğe kaydetmek için aşağıdaki kodu kullanırsınız:

router.post("/users",function(req,res){
    res.send(JSON.stringify(req.body, null, 4));
});

2
Verilen çözüm ayrıştırıcı modülü eklenmeden tamamlanmamıştır.
gramcha
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.