Como analisar dados de campo / arquivo multipartes separadamente?

9

Quero analisar um formulário de várias partes duas vezes: uma vez para pegar os campos recebidos e depois para processar o upload do arquivo.

Estou tentando manter uma separação adequada de preocupações no meu aplicativo Node:

  • O controlador é responsável por manipular os campos recebidos.
  • O modelo é responsável pela lógica do upload de arquivos.

Preciso passar os dados dos campos para o modelo para criar uma nova instância, para que os dados dos campos precisem estar disponíveis antes do início do upload do arquivo.

Atualmente, todas as form.parse()funções ou funções equivalentes analisam campos e arquivos juntos . Exemplo: req.pipe(busboy)lida com arquivos e campos juntos.

Eu verifiquei módulos como node-multiparty, formidable, busboy, multer. Ninguém parece ter uma solução para isso.

Um exemplo do que eu gostaria de obter está aqui: /programming/22336177/node-js-busboy-parse-fields-and-files-seperatly

Isso é possível?

Scott
fonte
2
espera ... para que o modelo seja responsável pela lógica e pelo controle?
Matthew Mark Miller
Boa captura, normalmente essa arquitetura é ruim para misturar as preocupações. Isso foi há 2 anos, então eu não lembro exatamente qual problema estava solucionando quando fazia essa pergunta, mas lembro que queria que a lógica de salvamento fizesse parte do objeto de esquema do Mongoose. Por ter o método mangusto no modelo, eu poderia facilmente salvar de qualquer lugar no meu aplicativo. Olhando para trás, não acho que o método save seja genérico o suficiente para ser um modelo, provavelmente deve mantê-lo como um método de serviço separado. mongoosejs.com/docs/guide.html
Scott
11
lol, eu não tinha percebido quantos anos isso tinha ... de alguma forma fluiu para o topo da minha fila de "necessidades de resposta". e sim, acho correto manter as operações de persistência separadas dos dados persistentes ESPECIALMENTE quando esses objetos podem estar transferindo dados em duas dimensões. Facilita a bagunça e a persistência de coisas fora do controlador.
Matthew Mark Miller
@ Scott "Isso foi há 2 anos, então eu não me lembro exatamente de qual problema estava resolvendo quando estava fazendo essa pergunta" - então você pode excluir essa pergunta, pois é improvável que ela seja respondida ...
Timothy Truckle

Respostas:

1

Quero responder a esta pergunta:

É possível ler os cabeçalhos de campo com várias partes antes do conteúdo?

Quando olho para o rfc multipartes , vejo este exemplo:

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

Noto que os cabeçalhos Content-Typeestão localizados entre as partes do corpo. Assim, concluo, você não pode todos os cabeçalhos antes de todos os corpos.

Agora à sua pergunta:

Quero analisar um formulário de várias partes duas vezes: uma vez para pegar os campos recebidos e depois para processar o upload do arquivo.

Depende do que você quer dizer com "análise". Há alguma análise envolvida ao ler a mensagem HTTP para saber quando ela termina. O final tem um adicional --no final:

--boundary42--

Ideias para analisar duas vezes:

  • Concluo que é possível copiar toda a resposta do soquete e fazer a análise posteriormente.
  • Você pode ler os cabeçalhos do arquivo antes do corpo do arquivo, mas nem todos os cabeçalhos de todos os arquivos.

Isso é possível?

Sim, há casos em que isso é possível (quando o arquivo é a última coisa que você carrega). Não sei se é universalmente possível o que você precisa, pois não sei exatamente o que você quer fazer.

Eu espero que isto esclareça as coisas. Se essa não for uma resposta completa ou se você não gostar, informe-nos o motivo, pois isso pode ser um feedback valioso para outras pessoas que tentam responder à pergunta.

Do utilizador
fonte