Как разобрать составные данные поля / файла отдельно?


9

Я хочу проанализировать составную форму дважды: один раз, чтобы получить входящие поля, а затем обработать загрузку файла.

Я пытаюсь поддерживать правильное разделение проблем в моем приложении Node:

  • Контроллер отвечает за обработку входящих полей.
  • Модель отвечает за логику загрузки файла.

Мне нужно передать данные полей в модель, чтобы создать новый экземпляр, поэтому данные полей должны быть доступны до начала загрузки файла.

В настоящее время каждая form.parse()или эквивалентная функция анализирует поля и файлы вместе . Пример: req.pipe(busboy)обрабатывает файл и поля вместе.

Я проверил такие модули, как node-multiparty, грозный, busboy, multer. Кажется, ни у кого нет решения для этого.

Пример того, чего я хотел бы достичь, находится здесь: /programming/22336177/node-js-busboy-parse-fields-and-files-seperatly

Это вообще возможно?


2
подожди ... так ты будешь заставлять Модель отвечать за логику и контроль?
Мэтью Марк Миллер

Хороший улов, обычно эта архитектура плохо смешивает проблемы. Это было 2 года назад, поэтому я точно не помню, какую проблему я решал, когда задавал этот вопрос, но я помню, что хотел, чтобы логика сохранения была частью объекта схемы Mongoose. Имея метод мангуста на модели, я мог легко сохранить из любого места в моем приложении. Оглядываясь назад, я не думаю, что метод save достаточно универсален, чтобы быть методом модели, и, вероятно, должен хранить его как отдельный метод обслуживания. mongoosejs.com/docs/guide.html
Скотт

1
LOL Я не понял, сколько лет это было ... это как-то попало на вершину моей очереди "ответы на запросы". и да, я думаю, что правильно хранить операции персистентности отдельно от данных, сохраняемых ОСОБЕННО, когда эти объекты могут передавать данные в двух измерениях. Это позволяет легко испортить и сохранить вещи за пределами контроллера.
Мэтью Марк Миллер

@ Scott «Это было 2 года назад, поэтому я точно не помню, какую проблему я решал, когда задавал этот вопрос», - тогда вы можете удалить этот вопрос, поскольку вряд ли на него вообще ответят…
Тимоти Траклле

Ответы:


1

Я хочу ответить на этот вопрос:

Можно ли прочитать заголовки полей из нескольких частей перед их содержимым?

Когда я смотрю на multipart rfc , я вижу этот пример:

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

Отмечу, что заголовки вроде Content-Typeрасположены между частями тела. Таким образом, я пришел к выводу, вы не можете все заголовки перед всеми органами.

Теперь к вашему вопросу:

Я хочу проанализировать составную форму дважды: один раз, чтобы получить входящие поля, а затем обработать загрузку файла.

Это зависит от того, что вы подразумеваете под "разбором". При чтении HTTP-сообщения происходит анализ, чтобы узнать, когда оно заканчивается. Конец имеет дополнительный --в конце:

--boundary42--

Идеи разбора дважды:

  • Я пришел к выводу, что нужно иметь возможность скопировать весь ответ из сокета и выполнить анализ позже.
  • Вы можете прочитать заголовки файла перед телом файла, но не все заголовки всех файлов.

Это вообще возможно?

Да, есть случаи, когда это возможно (когда файл является последним загруженным файлом). Я не знаю, возможно ли всеобщее, что вам нужно, потому что я не знаю точно, что вы хотите сделать.

Я надеюсь, что это проясняет вещи. Если это не полный ответ или вам это не нравится, скажите нам, почему, потому что это может быть ценным откликом для тех, кто пытается ответить на вопрос.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.