Неверный заголовок типа контента, нет составной границы 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);
};