【问题标题】:bad content-type header, no multipart boundary nodejs错误的内容类型标头,没有多部分边界 nodejs
【发布时间】:2017-12-08 17:17:50
【问题描述】:

我有一个返回 content-type: "multipart/form-data; charset=utf-8" 内容的 API。但是,在我的 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

正文是一大块文本/字符串。

【问题讨论】:

  • 我怀疑你是否被允许使用--作为边界的后缀。
  • 好的,但删除没有帮助
  • GET 请求设置multipart/form-data 无论如何都没有意义。你确定它不应该是POST 请求吗?此外,看起来您实际上并没有上传数据,因此可能根本不需要 Content-Type 标头。
  • 好的,但即使删除也不起作用。错误保持不变。是的,我没有上传任何数据,但我收到的内容类型为“multipart/form-data”
  • 问题是错误的来源。我最初认为是服务器发出了该错误,但现在我明白它是客户端?我不希望 superagent 解析 multipart/form-data 响应,那么它来自哪里?你能发布属于错误的堆栈跟踪吗?

标签: node.js multipartform-data superagent


【解决方案1】:

根据RFC2045

...而“多部分”媒体类型的任何子类型都需要“边界”参数。

在您的情况下,服务器未设置该参数,因此响应无效,superagent(尝试解析响应)引发错误。

您可以使用替代 HTTP 客户端,前提是它不会尝试解析 multipart/form-data 响应。

您可以使用内置的http(s).get(),也可以使用request 包。

编辑:如果您被superagent 卡住,那么您可以对其进行monkeypatch,以便检测到损坏的响应并将其视为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);
};

【讨论】:

  • 无法禁用不必要的超级代理解析?
  • 不,据我所知,这不是一个可配置的选项。
  • 我可以让服务器以某种方式设置参数吗?我们必须为所有的 http 调用使用 superagent,所以我们不能使用任何其他的 http 服务。
  • 只有修改源代码才能让服务器设置。我已经编辑了我的答案以提供可能的解决方法。
【解决方案2】:

在传递带有文件的 multipart-formdata 时是正常的,您需要设置边界,以防万一文件比请求的大小更大。

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

link

【讨论】:

    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2015-09-04
    • 2015-12-23
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多