Comment analyser séparément les données de champ / fichier en plusieurs parties?


9

Je veux analyser un formulaire en plusieurs parties deux fois: une fois pour saisir les champs entrants, et plus tard pour traiter le téléchargement du fichier.

J'essaie de maintenir une séparation appropriée des préoccupations au sein de mon application Node:

  • Le contrôleur est responsable de la gestion des champs entrants.
  • Le modèle est responsable de la logique de téléchargement du fichier.

Je dois transmettre les données des champs au modèle pour créer une nouvelle instance, de sorte que les données des champs doivent être disponibles avant le début du téléchargement du fichier.

Actuellement, chaque form.parse()fonction ou une fonction équivalente analyse les champs et les fichiers ensemble . Exemple: req.pipe(busboy)gère à la fois le fichier et les champs.

J'ai vérifié des modules comme node-multiparty, formidable, busboy, multer. Personne ne semble avoir de solution à cela.

Un exemple de ce que j'aimerais réaliser est ici: /programming/22336177/node-js-busboy-parse-fields-and-files-seperatly

Est-ce seulement possible?


2
attendez ... vous allez donc demander au modèle d'être responsable de la logique et du contrôle?
Matthew Mark Miller

Bonne prise, normalement cette architecture est mauvaise pour mélanger les soucis. C'était il y a 2 ans, donc je ne me souviens pas exactement du problème que je résolvais lorsque je posais cette question, mais je me souviens que je voulais que la logique de sauvegarde fasse partie de l'objet de schéma Mongoose. En ayant la méthode mangouste sur le modèle, je pouvais facilement enregistrer n'importe où dans mon application. Avec le recul, je ne pense pas que la méthode de sauvegarde soit suffisamment générique pour être une méthode modèle, devrait probablement la garder comme méthode de service distincte. mongoosejs.com/docs/guide.html
Scott

1
lol je ne m'étais pas rendu compte de son âge ... ça coulait en quelque sorte en haut de ma file d'attente "besoin de répondre". et oui, je pense qu'il est correct de garder les opérations de persistance distinctes des données persistantes SURTOUT lorsque ces objets peuvent transférer des données en deux dimensions. Facilite le vissage et la persistance des choses en dehors du contrôleur.
Matthew Mark Miller

@Scott "C'était il y a 2 ans, donc je ne me souviens pas exactement du problème que je résolvais quand je posais cette question" - alors vous pouvez envisager de supprimer cette question car il est peu probable qu'on y réponde du tout ...
Timothy Truckle

Réponses:


1

Je veux répondre à cette question:

Est-il possible de lire les en-têtes de champs en plusieurs parties avant leur contenu?

Quand je regarde le rfc en plusieurs parties , je vois cet exemple:

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-- 

Je note que les en-têtes comme Content-Typesont situés entre les parties du corps. Ainsi je conclus, vous ne pouvez pas tous les en-têtes devant tous les corps.

Passons maintenant à votre question:

Je veux analyser un formulaire en plusieurs parties deux fois: une fois pour saisir les champs entrants, et plus tard pour traiter le téléchargement du fichier.

Cela dépend de ce que vous entendez par "analyse". Une analyse syntaxique est impliquée lors de la lecture du message HTTP pour savoir quand il se termine. La fin a un supplémentaire --à la fin:

--boundary42--

Idées pour analyser deux fois:

  • Je conclus, on devrait pouvoir copier la réponse entière du socket et faire l'analyse plus tard.
  • Vous pouvez lire les en-têtes du fichier avant le corps du fichier, mais pas tous les en-têtes de tous les fichiers.

Est-ce seulement possible?

Oui, il y a des cas où cela est possible (lorsque le fichier est la dernière chose que vous téléchargez). Je ne sais pas s'il est universellement possible ce dont vous avez besoin car je ne sais pas exactement ce que vous voulez faire.

J'espère que cela clarifie les choses. Si ce n'est pas une réponse complète ou si vous n'aimez pas cela, veuillez nous en expliquer la raison, car cela pourrait être un retour précieux pour les autres qui essaient de répondre à la question.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.