2

我在我的反应应用程序中使用Superagent,并且我正在对IPFS api 进行一些调用。具体来说,我正在将文件上传到我的 IPFS 服务器。现在,一切正常,当我上传一个或多个文件时,调用通过并且文件显示在 IPFS 中没有问题。

但是,当我上传多个文件时出现问题,响应似乎以纯文本而不是 JSON 形式返回,并且 superagent 抛出错误

client.js:399 Uncaught (in promise) Error: Parser is unable to parse the response
    at Request.<anonymous> (client.js:399)
    at Request.Emitter.emit (index.js:133)
    at XMLHttpRequest.xhr.onreadystatechange (client.js:708)

所以需要明确的是,上传单个文件时,我会得到一个很好的 JSON 响应,但是当我上传多个文件时,响应是纯文本的。

我可以强制 Superagent 给我回复并自己解析吗?或者我可以在拨打电话时设置一些东西以强制进行 json 解析吗?下面是我的超级代理请求功能

  add : acceptedFiles => {
    const url = ipfs.getUrl("add")
    const req = request.post(url)

    acceptedFiles.forEach(file => req.attach(file.name, file))

    req.then(res => {
      return console.log(res);
    })
  }
4

2 回答 2

1

我正在寻找一个更优雅的解决方案,但在我找到它之前,我想提供我自己的解决方案。


我认为这个问题是由错误的响应Content-Type集引起的,但我还没有证实这个观点。

但是,你可以试试这个:

req.catch(function (err) {
    console.log(err.rawResponse)
})

至少,这解决了我的问题。

于 2019-02-11T14:31:01.830 回答
1

根据他们的文档,您可以指定优先于内置解析器的自定义解析器:

您可以使用该方法设置自定义解析器(优先于内置解析器).buffer(true).parse(fn)。如果未启用响应缓冲(.buffer(false)),则将发出响应事件,而无需等待正文解析器完成,因此 response.body 将不可用。

我试过了,对我来说效果很好。

superagent.get('....')
    .buffer(true)
    .parse(({ text }) => JSON.parse(text))
    .then(...)
于 2019-02-11T14:41:22.880 回答