Суперагент .attach () файл или буфер данных пуст - PullRequest
0 голосов
/ 09 марта 2019

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

------WebKitFormBoundaryy6T3XReWRFT1KfFm
Content-Disposition: form-data; name="media"


------WebKitFormBoundaryy6T3XReWRFT1KfFm--

В файле нет никакой информации, и он выглядит пустым media:

Код, который я использую, прост:

.post(`${API_ROOT}${url}`)
        .withCredentials()
        .attach('media', body.media, 'filename.jpg')

Где body.media:

asBuffer(file, callback) {
    const reader = new FileReader();
    reader.addEventListener('load', () => callback(reader.result));
    reader.readAsDataURL(file);
}
asBuffer(file, ((b) => {
    body.media = b;
}));

или

body.media = new FormData();
body.media.append('file', inputFile, inputFileName);

или вместе с после asBuffer

Buffer.from(body.media, 'base64');

, где inputFile имеет тип File. Я также поиграл с attach и пропустил имя файла, когда body.media не было типа Buffer.

Я не верю, что с моей стороны есть проблема, поскольку использование .send(body.media) на самом деле прикрепляет файл к данным формы запроса, и я вижу его на внутреннем сервере. Только функция .attach() не работает должным образом, и мне это нужно, так как мне также нужно отправлять поля.

Единственный обходной путь, который я нашел в этот момент, был следующим:

const mediaFile = body.media;
delete body.media;
.post(...)
    .withCredentials()
    .query(body)
    .send(mediaFile)

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

1 Ответ

0 голосов
/ 09 марта 2019

После осмотра

https://github.com/visionmedia/superagent/blob/master/lib/client.js#L571

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

Так что просто передача inputFile типа File в .attach() решает проблему.

Кроме того, для полей у меня было дюжина из них, решение которых было:

.field('fieldName', JSON.stringify(body))

А на внутреннем сервере просто: JSON.parse(req.body.fieldName) для получения полезной нагрузки запроса в формате JSON.

...