Неверный заголовок типа контента, нет составной границы nodejs

У меня есть API, который возвращает контент с content-type: "multipart/form-data; charset=utf-8", Тем не менее, в моем приложении nodejs, когда я делаю следующий вызов через superagent:

request
    .get(ApiUrl + id)
    .set('Authorization', basicHttpAuth)
    .set('client_id', clientId)
    .set('client_secret', clientSecret)
    .end(function (err, res) {
        if (err) {
            callback(null, err)
            console.log(err);
        }
        else {
            callback(null, res);
        }
    })

Я получаю эту ошибку:

Ошибка: неверный заголовок типа контента, нет многочастной границы

Есть идеи, что случилось?

Трассировки стека:

Error: bad content-type header, no multipart boundary
    at IncomingForm._parseContentType (/Users/mike/Svr/Server/node_modules/formidable/lib/incoming_form.js:271:19)
    at IncomingForm.writeHeaders (/Users/mike/Svr/Server/node_modules/formidable/lib/incoming_form.js:142:8)
    at IncomingForm.parse (/Users/mike/Svr/Server/node_modules/formidable/lib/incoming_form.js:110:8)
    at ClientRequest.<anonymous> (/Users/mike/Svr/Server/node_modules/superagent/lib/node/index.js:869:9)
    at Object.onceWrapper (events.js:316:30)
    at emitOne (events.js:115:13)
    at ClientRequest.emit (events.js:210:7)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:564:21)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:116:23)
    at TLSSocket.socketOnData (_http_client.js:453:20) response: undefined }

Вот заголовок ответа сервера:

Access-Control-Allow-Origin →*
Connection →keep-alive
Content-Length →44691
Content-Type →multipart/form-data; charset=utf-8
Date →Wed, 05 Jul 2017 03:44:23 GMT

А тело это большой кусок текста / строки.

1 ответ

Нормально при передаче multipart-formdata с файлами, вам нужно установить границу, только если файл имеет больший размер, чем сделанный запрос.

  Content-Type: multipart/form-data;boundary=----WebKitFormBoundaryyrV7KO0BoCBuDbTL

ссылка на сайт

Согласно RFC2045:

... в то время как параметр "border" требуется для любого подтипа мультимедийного типа "multipart".

В вашем случае сервер не устанавливает этот параметр, поэтому ответ недействителен и superagent (который пытается разобрать ответ) выдает ошибку.

Возможно, вы сможете использовать альтернативный HTTP-клиент при условии, что он не пытается проанализировать multipart/form-data ответы.

Вы можете использовать встроенный http(s).get() или, возможно, request пакет.

РЕДАКТИРОВАТЬ: если вы застряли с superagent тогда вы сможете установить обезьянький патч, чтобы он обнаруживал неработающий ответ и рассматривал его как text/plain,

Добавьте следующее где-нибудь "высоко" в вашем коде (перед использованием superagent):

const Utils     = require('superagent/lib/utils');
const UtilsType = Utils.type;
Utils.type = function(type) {
  if (type === 'multipart/form-data; charset=utf-8') {
    type = 'text/plain; charset=utf-8';
  }
  return UtilsType.call(this, type);
};
Другие вопросы по тегам