使用JavaScript向IPFS上传对象报Input not supported错误怎么办
问题现象
上传对象到IPFS时触发类型不匹配报错,错误信息:
Input not supported. Expected Buffer|ReadableStream|PullStream|File|Array<Object> got object
触发报错的原始代码:
let data = { name: bot, description: "", image: "https://ipfs.infura.io/ipfs/myimagehash", }; const client = ipfsClient({ host: "ipfs.infura.io", port: 5001, protocol: "https", }); try { const added = await client.add(data); const url = `https://ipfs.infura.io/ipfs/${added[0].path}`; return url; } catch (error) { console.log("Error uploading file: ", error); }
报错原因
ipfs-client的add方法不支持直接传入无结构的普通JS对象,方法要求入参必须是以下类型之一:Buffer、ReadableStream、PullStream、File实例、符合UnixFS规范的带content字段的对象/对象数组。直接传入裸的普通对象就会触发上述类型校验错误。
修复方法
如果要上传JSON格式的元数据,先把普通JS对象序列化为JSON字符串,再转成Buffer作为内容传入即可,修复后的代码如下:
let data = { name: bot, description: "", image: "https://ipfs.infura.io/ipfs/myimagehash", }; const client = ipfsClient({ host: "ipfs.infura.io", port: 5001, protocol: "https", }); try { // 序列化对象为Buffer const content = Buffer.from(JSON.stringify(data)); // 传入带content字段的合规对象,可指定path后缀为.json方便网关识别内容类型 const added = await client.add({ content: content, path: "metadata.json" }); // 注意:新版本ipfs-client单文件add直接返回文件对象,无需取[0],老版本数组格式可按需兼容 const url = `https://ipfs.infura.io/ipfs/${added.path}`; return url; } catch (error) { console.log("Error uploading file: ", error); }
补充说明
- 序列化后上传是兼容性最好的方案,支持所有版本的IPFS客户端
- 如果需要上传多个文件到同一个目录,可以传入对象数组,每个对象都必须包含
path和content字段 - 不要省略JSON序列化步骤,依赖隐式类型转换处理对象会导致元数据格式损坏,后续无法正常解析
内容的提问来源于stack exchange,提问作者hora
相关产品推荐
相关产品推荐

