使用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
相关产品推荐
相关产品推荐

