Node.js集成js-ipfs执行cat命令报ENOENT文件不存在错误
这个错误确实是IPFS仓库(repo)配置逻辑错误直接导致的,核心问题出在两处:
- 你的repo生成函数使用
Math.random()返回随机路径,每次应用启动都会生成一个全新的、空的临时IPFS仓库,和全局jsipfs命令行工具默认使用的C:\Users\hp\.jsipfs仓库完全隔离、数据不互通。 - 启动日志里的
jsipfs cat提示是js-ipfs启动时的固定通用输出,不会感知你当前使用了自定义随机仓库,也不会判断节点是否已经完成公网连接、能拉取到对应CID的内容。
你执行全局jsipfs cat命令时,命令行工具只会读取自己默认仓库下的块文件,这个默认仓库里既没有本地存储目标CID对应的块数据,刚启动的节点也没完成DHT路由找到持有该内容的对等节点,直接就会抛出找不到本地块文件的ENOENT错误。
先修正repo配置逻辑
开发测试阶段不要用随机值生成repo路径,否则每次启动节点都是全新状态,之前存储的数据、建立的连接记录全部丢失。你可以指定固定路径作为仓库:// 固定使用项目目录下的ipfs-repo文件夹作为仓库 function repo () { return './ipfs-repo' }如果需要让应用内节点和全局jsipfs共用仓库,直接把repo路径指向
C:\Users\hp\.jsipfs即可,注意两个IPFS节点不能同时启动占用同一个仓库,会触发文件锁报错。不要用全局jsipfs命令测试应用内节点的能力
你要测试节点是否能正常获取内容,直接在应用代码里调用节点实例的cat接口即可,不要跨节点操作:ipfs.on('ready', async () => { const chunks = [] for await (const chunk of ipfs.cat('/ipfs/QmRaaUwTNfwgFZpeUy8qrZwrp2dY4kCKmmB5xEqvH3vtD1/readme')) { chunks.push(chunk) } console.log('readme内容:', Buffer.concat(chunks).toString()) })给节点留够组网时间
IPFS节点刚启动时需要1~3分钟连接公网引导节点、同步DHT路由表,刚启动立刻执行内容获取操作大概率会因为找不到对等节点失败,等节点日志打印出足够多的Swarm connected日志之后再测试功能。非必要可以跳过readme验证步骤
那个cat命令只是用来验证节点基础访问能力的欢迎示例,和你要开发的pubsub点对点聊天功能没有直接关联,如果只是测试消息收发,直接调用ipfs.pubsub.subscribe和ipfs.pubsub.publish接口即可,不需要先成功拉取这个readme文件。
内容的提问来源于stack exchange,提问作者Vakindu

