读取Truffle合约ABI文件时提示File not found错误如何解决
错误原因
Error: ENOENT: no such file or directory属于文件读取路径匹配错误,具体诱因有两点:
- Node.js的
fs模块解析./开头的相对路径时,基准路径是执行node命令时终端所在的工作目录,不是当前运行的JS脚本自身的存放目录。从项目结构看,build目录位于src文件夹下,如果你在项目根目录执行脚本,原代码里的./build/contracts/QUAD_EK.json会指向根目录下的build文件夹,和实际文件位置不匹配。 - 原代码存在隐藏逻辑问题:Truffle编译输出的合约JSON文件中,存储ABI的字段名是
abi,不是自定义的token_abi,就算路径修复完成,这行解构代码也会拿到undefined。
修复方法
优先推荐第一种不受执行目录影响的方案:
方案1:基于脚本位置拼接绝对路径
引入Node.js内置的path模块,用__dirname(代表当前脚本所在目录的绝对路径)拼接目标文件路径,完全不受终端执行位置影响:
const Web3 = require('web3') const fs = require('fs') const path = require('path') // 如果当前脚本和src下的build目录同级,直接用下面的路径即可;如果脚本位置有变动,调整path.resolve里的相对层级 const contractFilePath = path.resolve(__dirname, './build/contracts/QUAD_EK.json') const { abi: token_abi } = JSON.parse(fs.readFileSync(contractFilePath, 'utf8'))
方案2:调整相对路径适配执行目录
如果你固定在项目根目录执行脚本(比如执行命令为node src/你的脚本文件名.js),可以直接把路径改成根目录视角的相对路径:
const Web3 = require('web3') const fs = require('fs') const { abi: token_abi } = JSON.parse(fs.readFileSync('./src/build/contracts/QUAD_EK.json', 'utf8'))
注意:该方案稳定性差,如果切换到src目录下执行脚本,路径会再次失效,不推荐长期使用。
前置检查
如果调整路径后仍然报错,先确认你已经执行过Truffle编译命令,只有编译完成才会生成对应合约的JSON文件:
truffle compile
编译完成后可以手动进入对应build/contracts目录,确认QUAD_EK.json文件存在。
内容的提问来源于stack exchange,提问作者Emily Kuo
相关产品推荐
相关产品推荐

