You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node/Express中从JSON生成Blob数据,前端接收为空的问题求助

问题原因

Node.js环境中的Blob(无论是buffer模块的还是其他实现)本质上是基于Buffer的封装,但当你通过res.send()将其作为JSON对象的一部分返回时,JSON序列化无法正确处理Blob的内部数据,最终前端只能拿到空对象{}。

正确解决方案

不需要在后端创建Blob,直接给前端返回JSON数据或Buffer,让前端自行生成Blob,或者后端直接返回文件流触发浏览器下载。

方案1:后端返回JSON字符串,前端生成Blob并下载

后端代码:

const myJsonFileData = { "id": 1, "name":"abc"};
return res.send({
  filename: 'xxx.json',
  data: JSON.stringify(myJsonFileData, null, 2)
});

前端处理代码:

// 假设res是后端返回的响应数据
const { filename, data } = res.data;
const blob = new Blob([data], { type: 'application/json;charset=utf-8' });
// 创建下载链接
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
a.click();
URL.revokeObjectURL(url);

方案2:后端直接返回文件流,触发浏览器下载

如果不需要前端额外处理,直接让浏览器下载文件更高效:

const myJsonFileData = { "id": 1, "name":"abc"};
const jsonStr = JSON.stringify(myJsonFileData, null, 2);

// 设置响应头,告知浏览器这是下载文件
res.setHeader('Content-Disposition', `attachment; filename="xxx.json"`);
res.setHeader('Content-Type', 'application/json;charset=utf-8');
// 直接发送JSON字符串
res.send(jsonStr);

这种方式下前端会直接触发文件下载,无需手动处理Blob。

方案3:后端返回Base64编码的Buffer,前端转Blob

如果必须传输二进制数据:
后端代码:

const myJsonFileData = { "id": 1, "name":"abc"};
const jsonStr = JSON.stringify(myJsonFileData, null, 2);
const buffer = Buffer.from(jsonStr, 'utf8');

return res.send({
  filename: 'xxx.json',
  buffer: buffer.toString('base64') // 转Base64字符串传输
});

前端处理代码:

const { filename, buffer } = res.data;
const byteCharacters = atob(buffer);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
  byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], { type: 'application/json;charset=utf-8' });
// 后续下载逻辑同方案1
原方法无效的核心原因

你使用的buffer.Blob是Node.js环境的专属实现,和浏览器端Blob结构差异极大。当你把它放入res.send()的响应对象中时,JSON序列化只会处理其可枚举属性,而Blob的内部数据是不可枚举的,因此前端收到的只能是空对象。

内容的提问来源于stack exchange,提问作者micronyks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:15:42