Çok parçalı alan / dosya verilerini ayrı olarak ayrıştırma


9

Çok bölümlü bir formu iki kez ayrıştırmak istiyorum: bir kez gelen alanları kapmak ve daha sonra dosya yüklemeyi işlemek için.

Düğüm uygulamamdaki kaygıların doğru bir şekilde ayrılmasını sağlamaya çalışıyorum:

  • Kontrolör, gelen alanların işlenmesinden sorumludur.
  • Yükleme dosyası mantığından model sorumludur.

Alanlar veri yeni bir örnek oluşturmak için modeline geçmek gerekir, bu yüzden alanları veri dosya yükleme başlamadan önce kullanılabilir olması gerekir .

Şu anda her form.parse()veya eşdeğer işlev hem alanları hem de dosyaları birlikte ayrıştırır . Örnek: req.pipe(busboy)hem dosya hem de alanları birlikte işler.

Düğüm çok partili, müthiş, busboy, multer gibi modülleri kontrol ettim. Kimsenin bunun için bir çözümü yok gibi görünüyor.

Neyi başarmak istediğime bir örnek burada: /programming/22336177/node-js-busboy-parse-fields-and-files-seperatly

Bu mümkün mü?


2
bekleyin ... yani Modelin mantık ve kontrolden sorumlu olmasını mı sağlayacaksınız?
Matthew Mark Miller

İyi yakalayın, normalde mimarinin endişeleri karıştırmak kötüdür. Bu 2 yıl önceydi, bu yüzden bu soruyu sorduğumda hangi problemi çözdüğümü tam olarak hatırlamıyorum, ancak kaydetme mantığının Mongoose şema nesnesinin bir parçası olmasını istediğimi hatırlıyorum. Mongoose yöntemini modelde uygulayarak, uygulamamın herhangi bir yerinden kolayca kaydedebilirim. Geriye dönüp baktığımda, kaydetme yönteminin bir model yöntem olacak kadar genel olduğunu düşünmüyorum, muhtemelen ayrı bir hizmet yöntemi olarak tutmalıdır. mongoosejs.com/docs/guide.html
Scott

1
lol bu kaç yaşında olduğunu fark etmemişti ... bir şekilde benim "cevap ihtiyaçları" kuyruğunun üstüne aktı. ve evet, bence bu nesneler iki boyutta veri aktarıyorsa, kalıcılık işlemlerini özel olarak kalıcı verilerden ayrı tutmanın doğru olduğunu düşünüyorum. Denetleyicinin dışındaki şeylerin vidalanmasını ve sürmesini kolaylaştırır.
Matthew Mark Miller

@Scott "Bu 2 yıl önceydi, bu yüzden bu soruyu sorduğumda hangi problemi çözdüğümü tam olarak hatırlamıyorum" - o zaman bu soruyu silmeyi düşünmüyorsunuz çünkü hiç cevap verilmeyebilir ...
Timothy Truckle

Yanıtlar:


1

Bu soruya cevap vermek istiyorum:

Çok parçalı alan başlıklarını içeriklerinden önce okumak mümkün müdür?

Çok parçalı rfc'ye baktığımda şu örneği görüyorum:

From:  Nathaniel Borenstein <nsb@bellcore.com> 
To: Ned Freed <ned@innosoft.com> 
Subject: Formatted text mail 
MIME-Version: 1.0 
Content-Type: multipart/alternative; boundary=boundary42 


--boundary42 
Content-Type: text/plain; charset=us-ascii 

...plain text version of message goes here.... 

--boundary42 
Content-Type: text/richtext 

.... richtext version of same message goes here ... 
--boundary42 
Content-Type: text/x-whatever 

.... fanciest formatted version of same  message  goes  here 
... 
--boundary42-- 

Gibi başlıkların Content-Typevücut parçaları arasında yer aldığını not ediyorum . Böylece sonuca varabilirim, tüm başlıklar tüm bedenlerden önce olamaz.

Şimdi sorunuza:

Çok bölümlü bir formu iki kez ayrıştırmak istiyorum: bir kez gelen alanları kapmak ve daha sonra dosya yüklemeyi işlemek için.

"Ayrıştırma" ile ne demek istediğinize bağlıdır. HTTP iletisini ne zaman sona erdiğini bilmek için bazı ayrıştırmalar söz konusudur. Sonun sonunda bir ek var --:

--boundary42--

İki kez ayrıştırma fikirleri:

  • Sonuç olarak, tüm cevabı soketten kopyalayabilmeli ve daha sonra ayrıştırma yapabilmelidir.
  • Dosyanın üstbilgilerinden önce dosyanın üstbilgilerini okuyabilir, ancak tüm dosyaların üstbilgilerini okuyamazsınız.

Bu mümkün mü?

Evet, bunun mümkün olduğu durumlar vardır (dosya yüklediğiniz son şey olduğunda). Tam olarak ne yapmak istediğinizi bilmediğim için neye ihtiyacınız olduğunu evrensel olarak mümkün olup olmadığını bilmiyorum.

Umarım bu bir şeyleri açıklığa kavuşturur. Bu tam bir cevap değilse veya bundan hoşlanmıyorsanız, lütfen bize nedenini söyleyin, çünkü bu soruya cevap vermeye çalışan diğerleri için değerli bir geri bildirim olabilir.

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.