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

无法从NestJS REST服务器发送Blob对象的问题咨询

NestJS返回Blob为空对象的原因及解决办法

对,就是NestJS默认的JSON序列化机制(基于JSON.stringify)无法处理Blob对象导致的问题。

原因分析

  • Blob是浏览器环境原生对象,Node.js后续实现的Blob内部属性并非可枚举类型,JSON.stringify遍历不到有效属性,最终会被序列化成空对象{}。
  • Node.js的Buffer被JSON.stringify特殊处理,会自动转换为base64字符串,因此能正常返回给前端。

解决办法

  1. 直接返回Buffer(最简便方案)
    既然直接返回Buffer可以正常工作,这是最省心的处理方式,前端收到数据后可自行转换为Blob。

  2. 将Buffer转为base64字符串返回
    如果业务需要返回字符串格式的图片数据,无需经过Blob转换,直接从Buffer转base64即可:

    // 从Buffer直接生成base64字符串
    const imageBase64 = imageBuffer.toString('base64');
    // 建议同时返回图片MIME类型,方便前端处理
    return {
      image: imageBase64,
      mimeType: 'image/jpeg' // 根据实际图片类型调整
    };
    

    前端拿到后可通过data:URL或Uint8Array转成Blob。

  3. 自定义拦截器处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:05:03