Buradaki birçok cevap artık iyi uygulamalar değil ya da hiçbir şeyi açıklamıyor, bu yüzden bunu yazıyorum.
temeller
Http.createServer'ın geri çağrılması çağrıldığında, sunucunun istek için tüm üstbilgileri gerçekten almasıdır, ancak verilerin henüz alınmamış olması mümkündür, bu yüzden beklememiz gerekir. Http isteği nesneler (http.IncomingMessage örneği) aslında bir olan okunabilir akışı . Bir yığın veri geldiğinde okunabilir akışlarda bir olay yayınlanır (buna geri arama kaydettiğiniz varsayılarak) ve tüm parçalar geldiğinde bir olay gönderilir. Olayları nasıl dinlediğinize ilişkin bir örnek:data
end
http.createServer((request, response) => {
console.log('Now we have a http message with headers but no data yet.');
request.on('data', chunk => {
console.log('A chunk of data has arrived: ', chunk);
});
request.on('end', () => {
console.log('No more data');
})
}).listen(8080)
Tamponları Dizelere Dönüştürme
Bunu denerseniz, parçaların tamponlar olduğunu . İkili verilerle uğraşmıyorsanız ve bunun yerine dizelerle çalışmanız gerekiyorsa , akışın verilen kodlamayla yorumlanan ve çok baytlı karakterleri doğru şekilde işlediği akışa neden olan request.setEncoding yöntemini kullanmanızı öneririz .
Tamponlama Topakları
Şimdi muhtemelen her bir parçaya kendi başına ilgi duymuyorsunuz, bu durumda muhtemelen bu şekilde tamponlamak istiyorsunuz:
http.createServer((request, response) => {
const chunks = [];
request.on('data', chunk => chunks.push(chunk));
request.on('end', () => {
const data = Buffer.concat(chunks);
console.log('Data: ', data);
})
}).listen(8080)
Burada , tüm arabellekleri birleştiren ve bir büyük arabellek döndüren Buffer.concat kullanılır. Concat-stream modülünü de kullanabilirsinizAynı şeyi yapan :
const http = require('http');
const concat = require('concat-stream');
http.createServer((request, response) => {
concat(request, data => {
console.log('Data: ', data);
});
}).listen(8080)
İçeriği Ayrıştırma
HTML hiçbir dosya veya teslim olan POST gönderimi oluşturur kabul etmeye çalışıyorsanız jQuery ajax varsayılan içerik türüyle aramaların ardından içerik türüdür application/x-www-form-urlencoded
ile uft-8
kodlama. Sorgulamayı kaldırmak ve özelliklerine erişmek için querystring modülünü kullanabilirsiniz :
const http = require('http');
const concat = require('concat-stream');
const qs = require('querystring');
http.createServer((request, response) => {
concat(request, buffer => {
const data = qs.parse(buffer.toString());
console.log('Data: ', data);
});
}).listen(8080)
İçerik türünüz bunun yerine JSON ise , qs.parse yerine JSON.parse komutunu kullanabilirsiniz . .
Dosyalarla uğraşıyorsanız veya çok parçalı içerik türünü işliyorsanız, bu durumda, tüm acıyı onunla uğraşmaktan uzaklaştıran müthiş bir şey kullanmalısınız. Bu diğer cevaba bir göz atınÇok parçalı içerikler için yararlı bağlantılar ve modüller yayınladığım .
borular
İçeriği ayrıştırmak istemiyorsanız, başka bir yere iletmek istiyorsanız, örneğin veri olarak başka bir http isteğine gönderin veya önerdiğim bir dosyaya kaydedin bunu boru daha az olacak şekilde yerine, onu ara belleğe kod, geri basıncı daha iyi idare eder, daha az bellek ve bazı durumlarda daha hızlı sürer.
İçeriği bir dosyaya kaydetmek istiyorsanız:
http.createServer((request, response) => {
request.pipe(fs.createWriteStream('./request'));
}).listen(8080)
Veri Miktarını Sınırlama
Diğer yanıtların belirttiği gibi, kötü niyetli müşterilerin uygulamanızı çökertmek veya belleğinizi doldurmak için size büyük miktarda veri gönderebileceğini aklınızda bulundurun, böylece verileri yayan istekleri belirli bir sınırı aştığınızdan emin olun. Gelen verileri işlemek için bir kütüphane kullanmıyorsanız. Belirtilen sınıra ulaştığında isteği iptal edebilen akış ölçer gibi bir şey kullanmanızı öneririm :
limitedStream = request.pipe(meter(1e7));
limitedStream.on('data', ...);
limitedStream.on('end', ...);
veya
request.pipe(meter(1e7)).pipe(createWriteStream(...));
veya
concat(request.pipe(meter(1e7)), ...);
NPM Modülleri
Yukarıda HTTP istek gövdesini nasıl kullanabileceğinizi açıklarken, içeriği sadece arabelleğe almak ve ayrıştırmak için, büyük olasılıkla uç durumları daha iyi ele alacağı için bu modüllerden birini kendi başınıza uygulamak yerine kullanmanızı öneririm. Ekspres için vücut ayrıştırıcı kullanmanızı öneririm . Koa için benzer bir modül var .
Bir çerçeve kullanmazsanız, vücut oldukça iyidir.