【问题标题】:Superagent .attach() file or buffer data is emptySuperagent .attach() 文件或缓冲区数据为空
【发布时间】:2019-07-31 09:42:40
【问题描述】:

我遇到了这个问题,超级代理没有正确地将文件或缓冲区附加到请求中,我提到空的原因是由于表单数据看起来像:

------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。 我已经看到一些类似的问题已经发布,但似乎没有一个答案。

【问题讨论】:

    标签: node.js reactjs express superagent


    【解决方案1】:

    检查后

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

    表明 superagent 有自己的 FormData 变量,它会将附加文件附加到该变量 - 这意味着我自己使用 FormData 是多余的,因此会导致嵌套,从而导致空负载。

    所以只需将File 类型的inputFile 传递给.attach() 即可解决问题。

    此外,对于我有十几个解决方案的领域:

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

    在后端服务器中只需:JSON.parse(req.body.fieldName) 以获取 JSON 格式的请求负载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 2019-08-13
      • 2014-09-26
      • 2012-02-04
      • 1970-01-01
      相关资源
      最近更新 更多