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

使用Node.js在Supabase上传文件时遭遇RequestInit错误:发送请求体需指定duplex选项

使用Node.js在Supabase上传文件时遭遇RequestInit错误:发送请求体需指定duplex选项

嘿,我看到你在Node.js环境下用Supabase上传文件时碰到了这个RequestInit: duplex option is required when sending a body错误,别慌,我来帮你拆解问题根源和修复方案~

错误原因解析

这个错误本质是Node.js的Fetch API(Supabase JS SDK底层依赖它)的规则更新:当你发送的请求体是一个可读流(比如你代码里的fs.createReadStream)时,必须显式指定duplex选项,来告知Fetch API如何处理流的双向通信。以前的版本可能默认处理了这个,但现在需要开发者手动配置。

具体修复方案

针对你的代码,有两种常用的修复方式,你可以根据文件大小选择:

方案1:将文件读取为Buffer上传(适合小文件)

把可读流换成同步读取的Buffer,这样就绕开了流的duplex配置问题,代码修改非常简单:

// 替换原有的fs.createReadStream部分
const { data, error } = await supabase.storage.from("articulos").upload(
  newFileName,
  fs.readFileSync(files.foto.filepath), // 读取为Buffer
  {
    cacheControl: '3600',
    upsert: false,
    contentType: files.foto.type,
  }
);

方案2:保留流上传并指定duplex选项(适合大文件)

如果要继续用可读流上传大文件,需要在Supabase的upload方法里添加Fetch的额外配置,指定duplex: 'half':

const { data, error } = await supabase.storage.from("articulos").upload(
  newFileName,
  fs.createReadStream(files.foto.filepath),
  {
    cacheControl: '3600',
    upsert: false,
    contentType: files.foto.type,
  },
  {
    duplex: 'half' // 添加这个Fetch请求选项
  }
);

额外注意事项(解决“图片没出现在桶里”的问题)

除了duplex错误,还有可能是存储桶的权限配置问题:

  • 登录Supabase控制台,找到你的articulos存储桶
  • 检查桶的政策:确保有允许上传的政策(比如给匿名用户或认证用户开放INSERT权限)
  • 示例政策(可在SQL编辑器执行):
-- 允许认证用户上传到articulos桶
CREATE POLICY "Allow authenticated uploads to articulos" ON storage.objects
FOR INSERT TO authenticated
WITH CHECK (bucket_id = 'articulos');

另外,你的代码里还有几处可以优化的地方,比如:

  • 给mascotaDB.save()添加错误捕获,避免静默失败
  • 确保res.redirect只执行一次,比如放在try块的最后,避免逻辑分支里重复响应

备注:内容来源于stack exchange,提问作者Ana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 14:32:33