Node.js调用fs.readSync访问存在文件报ENOENT错误如何解决?
为什么文件存在却提示路径不存在
这是Node.js文件系统模块的相对路径解析规则导致的:
Node.js内置fs模块对./开头的相对路径,是按照Node进程启动时的工作目录(可通过process.cwd()打印查看) 解析,而非按照代码文件本身所在的目录解析。
你配置的srcRoot: './storage/root.txt',会从你执行启动命令(比如node index.js)的目录下查找storage/root.txt,而非从index.js或stateLogic.js所在的目录查找。只要你启动进程的目录和你预期的不一致,哪怕文件确实存在于代码目录下,也会报ENOENT不存在的错误。
你可以在调用readSync读取srcRoot之前新增一行打印,确认实际解析的路径和进程工作目录:
console.log('进程工作目录:', process.cwd()) console.log('目标文件查找路径:', programData.persistent.paths.srcRoot)
对比打印的路径和你实际root.txt的磁盘路径,就能直接确认路径解析偏差的问题。
你当前操作存在的问题
- 路径配置使用相对路径,依赖进程启动目录,稳定性极差,不同环境、不同启动方式都会触发路径找不到的问题
append是异步函数,你在Express路由中直接调用没有加await,也没有做错误捕获,所以才会出现UnhandledPromiseRejectionWarning未处理异常报错,后续哪怕路径问题修复,一旦trie操作、文件读写出错,会直接抛出未捕获异常,严重时会导致服务进程崩溃- 接口逻辑中没有等待
append操作执行完成就直接返回“写入成功”的响应,会出现接口返回成功但实际业务逻辑执行失败的逻辑不一致问题 - 小问题:响应内容中的
Writting为拼写错误,正确拼写为Writing
修复方案
- 把相对路径改为用
__dirname拼接的绝对路径,__dirname是当前代码文件所在目录的固定绝对路径,不受进程启动目录影响。比如srcRoot配置在index.js中就修改为:
const path = require('path') // 其他配置 srcRoot: path.join(__dirname, './storage/root.txt')
如果srcRoot是配置在stateLogic.js中,就在该文件中引入path模块用对应文件的__dirname拼接即可。
2. 修改Express路由为异步逻辑,增加错误捕获:
app.post('/write', async (req,res) => { try { const body = req.body; console.log('endpoint reached'); console.log(body); await logic.append(body.key, body.path); res.send('Writing to state was successful'); } catch (err) { console.error('写入操作失败:', err); res.status(500).send('写入失败:' + err.message); } });
内容的提问来源于stack exchange,提问作者4N0M41Y
相关产品推荐
相关产品推荐

