Gövde ayrıştırıcısı express ile ne yapar?


339

body-parserKullanmadan veri alabileceğimiz için neden bir Express uygulamasında ihtiyacımız olduğunu anlamıyorum body-parser. Ve aslında ne yapıyor ve nasıl?


54
HTTP POST verilerini okumak için "body-parser" düğüm modülünü kullanmalıyız. body-parser, bir formun girdisini okuyan ve onu erişilebilen bir javascript nesnesi olarak saklayan bir ekspres ara katman yazılımıdırreq.body
refactor

2
İle; üst olarak, isteğe HTTP içinde herhangi bir veri okumak ifade req.headersolarak, http paket vücut okuyabilir (dizi) req.body@CleanCrispCode açıklanabilir ve sorgu parametre olarak okuyabilir req.query.variablehızlı otomatik JavaScript isteği dönüştürür için, bu yardımcı olur objeler
Fernando Zamperin

3
@refactor - bu , gövde ayrıştırıcısını kullanmamızın birçok nedeninden biri olabilir , ancak ne yaptığını söylemez, yani HTTP istek ve yanıt nesneleri akıştır ve tek bir nesne olarak 'okunamaz' tüm akışın ilk önce arabelleğe alınmaması gibi . res.bodyres.body
ortonomi

1
Express 4.16 ve sonraki sürümleri ile dahili ayrıştırıcı kendi sürümlerini dahil ettiler, böylece bu paketi çekmeniz gerekmez.
StefanBob

Yanıtlar:


255

Express.js sürüm 4 ve sonraki sürümlerde HTTP POSTisteği işlemek için , adlı ara katman yazılımı modülünü yüklemeniz gerekir .body-parser

body-parserGelen bir istek akışının tüm vücut bölümünü ayıklar ve sunar req.body.

Ara katman yazılımı daha önce Express.js'nin bir parçasıydı, ancak şimdi ayrı olarak yüklemeniz gerekiyor.

Bu body-parsermodül, HTTP POSTistek kullanılarak gönderilen JSON, arabellek, dize ve URL kodlu verileri ayrıştırır . body-parserAşağıda gösterildiği gibi NPM kullanarak kurun .

npm install body-parser --save

2019-Nisan-2'de düzenleme: express@4.16.0'da express ile birlikte gelen body-parser ara katman yazılımı. daha fazla ayrıntı için bkz.


126
Bu muhtemelen şimdiye kadarki en saçma şey. Neden Express core devs, yeni gelenlerin web geliştirmede en yaygın kullanım durumları için ek ara katmanlar yüklemelerini sağlayarak gemiye binmelerini inanılmaz derecede zorlaştırıyor?
elmt

5
@elmt fikirleri olan bir şey istiyorsanız sails.js'yi deneyin
George

1
@ user1063287 evet öyle. urlencoded()ve json()aslında çağıran bir katman yazılımı işlevi döndüren ara katman yazılımı fabrikalarıdırnext()
Nick Manning

3
Lame @elmt değil, düğüm sadece web için değil, masaüstü, mobil, vb. De kullanılabilir ve bu durumlarda gerekli bir modül değildir. Düğüm herhangi bir yükümlülük
altına

28
@fnaquira - Kafan karıştı. Bu düğüm değil ekspres ile ilgilidir.
elmt

85

Evet onsuz çalışabiliriz body-parser. Bunu kullanmadığınızda, ham istek alırsınız ve vücudunuz ve üstbilgileriniz istek parametresinin kök nesnesinde değildir. Tüm alanları tek tek işlemeniz gerekecektir.

Veya body-parserekspres ekip bunu sürdürdüğü için kullanabilirsiniz.

Vücut ayrıştırıcısı sizin için neler yapabilir: İsteği basitleştirir.
Nasıl kullanılır: İşte örnek:

Yüklemek npm install body-parser --save

Ekspres ayrıştırıcı nasıl kullanılır:

const express = require('express'),
      app = express(),
      bodyParser = require('body-parser');

// support parsing of application/json type post data
app.use(bodyParser.json());

//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));

Bağlantı.

https://github.com/expressjs/body-parser .

Ve sonra kök istek nesnesinde gövde ve başlıklar alabilirsiniz. Misal

app.post("/posturl",function(req,res,next){
    console.log(req.body);
    res.send("response");
})

3
Hey bilgi için teşekkürler, gövde ayrıştırıcı olmadan bir kod örneği gönderebilir misiniz?
Ilyas karim

55

Cevap burada çok ayrıntılı ve zekice cevap içeriyor açıklamak:

Kısacası; body-parser , gelen bir istek akışının tüm vücut bölümünü çıkarır req.bodyve arayüzle daha kolay bir arayüz olarak ortaya koyar . Kendi başına ihtiyacınız yok, çünkü bunların hepsini kendiniz yapabilirsiniz. Ancak, büyük olasılıkla istediğinizi yapacak ve size sorundan kurtaracaktır.


Biraz daha derinlemesine gitmek için; body-parser, sıkıştırılmışsa gelen istek verilerini açmak için nodejs / zlib kullanan bir ara katman yazılımı ve "ayrıştırmadan" önce istek gövdesinin tam, ham içeriğini beklemek için stream-utils / raw-body kullanır (bu, istek gövdesini kullanmayacaksınız, biraz zaman kaybettiniz).

Ham içeriği aldıktan sonra, ayrıştırıcı, kullanmaya karar verdiğiniz özel ara yazılımlara bağlı olarak dört stratejiden birini kullanarak ayrıştırır:

  • bodyParser.raw () : Aslında gövdeyi ayrıştırmaz, yalnızca Arabelleğe Alınmış öğesinde daha önce arabelleğe alınan içerikleri gösterir req.body.

  • bodyParser.text () : Arabelleği düz metin olarak okur ve sonuç dizesini req.body'de gösterir.

  • bodyParser.urlencoded () : Metni URL kodlamalı veriler olarak ayrıştırır (tarayıcılar POST olarak ayarlanmış normal formlardan form verilerini gönderme eğilimindedir) ve elde edilen nesneyi (anahtarlar ve değerleri içeren) gösterir req.body. Karşılaştırma için; PHP'de tüm bunlar otomatik olarak yapılır ve açıklanır $_POST.

  • bodyParser.json () : Metni JSON olarak ayrıştırır ve ortaya çıkan nesneyi açarreq.body .

Sadece req.bodyistenen içeriğe ayarlandıktan sonra , yığındaki bir sonraki ara katman yazılımını çağırır, bu da daha sonra nasıl sıkıştırılacağını ve ayrıştırılacağını düşünmeden istek verilerine erişebilir.

Belgelerini okumak için gövde ayrıştırıcı github'a başvurabilirsiniz , çalışmasıyla ilgili bilgiler içerir.


47

Bunu en az teknik tutmaya çalışalım.

Diyelim ki node-js sunucusuna bir html form verisi gönderiyorsunuz yani sunucuya bir istekte bulundunuz. Sunucu dosyası, isteğinizi bir istek nesnesi altında alır. Şimdi, mantıksal olarak, bu istek nesnesini sunucu dosyanızda günlüğe kaydederseniz, form verilerinizi, içinde ayıklanabilecek bazı yerlerde görmelisiniz, ancak whoa! aslında bilmiyorsun!

Peki, verilerimiz nerede? Sadece isteğimde mevcut değilse nasıl çıkaracağız?

Bunun basit açıklaması http, form verilerinizi hedeflerine ulaştıklarında bir araya getirilmesi amaçlanan bitler ve parçalar halinde gönderir. Peki verilerinizi nasıl elde edersiniz?

Ancak, neden her zaman bu acıyı, verilerinizi parçalar için manuel olarak ayrıştırıp bir araya getirin. Bunu sizin için yapacak “body-parser” adlı bir şey kullanın.

body-parser, isteğinizi ayrıştırır ve gereksinim duyabileceğiniz alakalı bilgileri kolayca ayıklayabileceğiniz bir biçime dönüştürür.

Örneğin, ön ucunuzda bir kayıt formunuz olduğunu varsayalım. Dolduruyorsunuz ve sunucudan ayrıntıları bir yere kaydetmesini istiyorsunuz.

Gövde ayrıştırıcı kullanıyorsanız, isteğinizden kullanıcı adı ve parola çıkarmak aşağıdaki kadar basittir.

var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};

Temel olarak, ayrıştırıcı gelen isteğinizi ayrıştırdı, form verilerinizi içeren parçaları birleştirdi, sonra bu vücut nesnesini sizin için yarattı ve form verilerinizle doldurdu.


10

HTTP istek gövdesini ayrıştırır. Bu, genellikle, istediğiniz bilgilerin gövdede bulunduğu bir POST veya PUT PATCH HTTP isteği bağlamında, yalnızca vurduğunuz URL'den daha fazlasını bilmeniz gerektiğinde gereklidir.

Temelde onun JSON, düz metin ayrıştırmak için bir ara katman yazılımı veya sadece istediğiniz gibi başa çıkmak için ham bir Tampon nesne döndürme.


8

Gönderi verilerine erişmek için kullanmalıyız body-parser. Temel olarak body-parser, ifadenin bedeni okumasına ve sonra Jsonbunu anlayabildiğimiz bir nesneye ayrıştırmasına izin veren nedir .


7

Bunların hepsi bir kolaylık meselesidir.

Sorusu olsaydı Temelde, 'biz Do ihtiyaç kullanmak body-parser?' Cevap hayır'. Genellikle daha az esnek olacak ve aynı bilgileri elde etmek için yazmamız gereken kod miktarını artıracak daha dolambaçlı bir yol kullanarak, istemci-istek sonrası aynı bilgileri bulabiliriz.

Bu, ' Başlamak için kullanmamız gerekiyorexpress mu?' Yine, cevap yoktur ve yine, gerçekten de, 'yerleşik' ile gelen temel şeyleri yapmak için daha fazla kod yazma zahmetinden kurtulmak için aşağı iner.

Yüzeyde - body-parserham veri akışlarını yakalamanızı ve bilgilerin hangi formatta olduğunu bulmanız yerine bu bilgileri kullanılabilir verilere daha az ayrıştırmak yerine, istemci isteklerinde bulunan bilgilere çeşitli formatlarda ulaşmayı kolaylaştırır.


6

Talepler Organını Anlama

Bir POST veya PUT isteği alırken, istek gövdesi uygulamanız için önemli olabilir. Gövde verilerine ulaşmak, istek başlıklarına erişmekten biraz daha kapsamlıdır. Bir işleyiciye iletilen istek nesnesi, ReadableStream arabirimini uygular. Bu akış diğer herhangi bir akış gibi dinlenebilir veya başka bir yerde dinlenebilir. Akışın 'veri' ve 'son' olaylarını dinleyerek verileri akıştan alabiliriz.

Her bir 'data' olayında yayılan yığın bir Arabelleğe alınır. Bunun dize verisi olacağını biliyorsanız, yapılacak en iyi şey bir dizideki verileri toplamak, daha sonra 'sonunda' toplamak ve birleştirmek.

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has the entire request body stored in it as a string
});

Body ayrıştırıcıyı anlama

Belgelerine göre

Req.body özelliğinin altında bulunan, işleyicilerinizden önce bir ara yazılımda gelen istek gövdelerini ayrıştırın.

İlk örnekte gördüğünüz gibi, gövdeyi çıkarmak için gelen istek akışını manuel olarak ayrıştırmak zorunda kaldık. Farklı türde birden çok form verisi olduğunda bu biraz sıkıcı olur. Bu yüzden, tüm bu görevi kaputun altında yapan body-parser paketini kullanıyoruz.

Farklı veri türlerini ayrıştırmak için dört modül sağlar

Ham içeriği aldıktan sonra ayrıştırıcı, verileri ayrıştırmak için yukarıdaki stratejilerden birini (kullanmaya karar verdiğiniz ara katman yazılımına bağlı olarak) kullanacaktır. Dokümanlarını okuyarak onlar hakkında daha fazla bilgi edinebilirsiniz.

req.bodyAyrıştırılmış gövdeye ayarlandıktan sonra , gövde ayrıştırıcı bir next()sonraki ara katmanı yığının altına çağırmaya çağırır, bu da daha sonra nasıl sıkıştırılacağını ve ayrıştırılacağını düşünmeden istek verilerine erişebilir.

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.