¿Cómo analizar los datos de campo / archivo de varias partes por separado?

9

Quiero analizar un formulario de varias partes dos veces: una para tomar los campos entrantes y luego para procesar la carga del archivo.

Estoy tratando de mantener una separación adecuada de preocupaciones dentro de mi aplicación Node:

  • El controlador es responsable de manejar los campos entrantes.
  • El modelo es responsable de la lógica del archivo de carga.

Necesito pasar los datos de los campos al modelo para crear una nueva instancia, por lo que los datos de los campos deben estar disponibles antes de que comience la carga del archivo.

Actualmente, cada form.parse()función o equivalente analiza ambos campos y archivos juntos . Ejemplo: req.pipe(busboy)maneja ambos archivos y campos juntos.

He comprobado módulos como node-multiparty, formidable, busboy, multer. Nadie parece tener una solución para esto.

Un ejemplo de lo que me gustaría lograr es aquí: /programming/22336177/node-js-busboy-parse-fields-and-files-seperatly

¿Es esto posible?

Scott
fuente
2
espera ... ¿entonces vas a hacer que el Modelo sea responsable de la lógica y el control?
Matthew Mark Miller el
Buena captura, normalmente esa arquitectura es mala para mezclar las preocupaciones. Esto fue hace 2 años, así que no recuerdo exactamente qué problema estaba resolviendo cuando hacía esta pregunta, pero sí recuerdo que quería que la lógica de guardado fuera parte del objeto de esquema Mongoose. Al tener el método de mangosta en el modelo, podría guardar fácilmente desde cualquier lugar de mi aplicación. Mirando hacia atrás, no creo que el método de guardar sea lo suficientemente genérico como para ser un método modelo, probablemente debería mantenerlo como un método de servicio separado. mongoosejs.com/docs/guide.html
Scott
1
jaja, no me había dado cuenta de cuántos años tenía esto ... de alguna manera fluyó a la cima de mi cola de "necesita respuesta". y sí, creo que es correcto mantener las operaciones de persistencia separadas de los datos que se persisten ESPECIALMENTE cuando esos objetos pueden estar transfiriendo datos en dos dimensiones. Hace que sea fácil fastidiar y persistir cosas fuera del controlador.
Matthew Mark Miller el
@Scott "Esto fue hace 2 años, así que no recuerdo exactamente qué problema estaba resolviendo cuando estaba haciendo esta pregunta" , entonces puede considerar eliminar esta pregunta ya que es poco probable que se responda en absoluto ...
Timothy Truckle

Respuestas:

1

Quiero responder esta pregunta:

¿Es posible leer los encabezados de campo de varias partes antes de su contenido?

Cuando miro el rfc multiparte , veo este ejemplo:

From:  Nathaniel Borenstein <[email protected]> 
To: Ned Freed <[email protected]> 
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-- 

Observo que los encabezados como Content-Typese encuentran entre las partes del cuerpo. Por lo tanto, concluyo, no puedes todos los encabezados antes de todos los cuerpos.

Ahora a su pregunta:

Quiero analizar un formulario de varias partes dos veces: una para tomar los campos entrantes y luego para procesar la carga del archivo.

Depende de lo que quieras decir con "análisis". Hay algún análisis involucrado al leer el mensaje HTTP para saber cuándo termina. El final tiene un adicional --al final:

--boundary42--

Ideas para analizar dos veces:

  • Concluyo que uno debería poder copiar la respuesta completa del socket y analizarla más tarde.
  • Puede leer los encabezados del archivo antes del cuerpo del archivo, pero no todos los encabezados de todos los archivos.

¿Es esto posible?

Sí, hay casos en los que es posible (cuando el archivo es lo último que carga). No sé si es universalmente posible lo que necesita, ya que no sé exactamente lo que quiere hacer.

Espero que esto aclare las cosas. Si esta no es una respuesta completa o si no le gusta, díganos por qué, ya que esto podría ser un comentario valioso para otros que intentan responder la pregunta.

Usuario
fuente