无法从NestJS REST服务器发送Blob对象的问题咨询
NestJS返回Blob为空对象的原因及解决办法
对,就是NestJS默认的JSON序列化机制(基于JSON.stringify)无法处理Blob对象导致的问题。
原因分析
- Blob是浏览器环境原生对象,Node.js后续实现的Blob内部属性并非可枚举类型,
JSON.stringify遍历不到有效属性,最终会被序列化成空对象{}。 - Node.js的Buffer被
JSON.stringify特殊处理,会自动转换为base64字符串,因此能正常返回给前端。
解决办法
直接返回Buffer(最简便方案)
既然直接返回Buffer可以正常工作,这是最省心的处理方式,前端收到数据后可自行转换为Blob。将Buffer转为base64字符串返回
如果业务需要返回字符串格式的图片数据,无需经过Blob转换,直接从Buffer转base64即可:// 从Buffer直接生成base64字符串 const imageBase64 = imageBuffer.toString('base64'); // 建议同时返回图片MIME类型,方便前端处理 return { image: imageBase64, mimeType: 'image/jpeg' // 根据实际图片类型调整 };前端拿到后可通过
data:URL或Uint8Array转成Blob。自定义拦截器处理Blob序列化
若必须返回Blob对象,可通过NestJS拦截器自定义序列化逻辑:import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @Injectable() export class BlobSerializeInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { return next.handle().pipe( map(async (data) => { if (data instanceof Blob) { const arrayBuffer = await data.arrayBuffer(); return Buffer.from(arrayBuffer).toString('base64'); } return data; }), ); } }然后在控制器上绑定拦截器:
@UseInterceptors(BlobSerializeInterceptor) @Get('image') getImage() { // 业务逻辑,返回Blob对象 }
额外提示
Node.js环境中的Blob兼容性和实用性不如Buffer,后端处理二进制数据优先选择Buffer会更顺畅,Blob更适合在浏览器端使用。
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

