You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的磁盘路径,就能直接确认路径解析偏差的问题。

你当前操作存在的问题

  1. 路径配置使用相对路径,依赖进程启动目录,稳定性极差,不同环境、不同启动方式都会触发路径找不到的问题
  2. append是异步函数,你在Express路由中直接调用没有加await,也没有做错误捕获,所以才会出现UnhandledPromiseRejectionWarning未处理异常报错,后续哪怕路径问题修复,一旦trie操作、文件读写出错,会直接抛出未捕获异常,严重时会导致服务进程崩溃
  3. 接口逻辑中没有等待append操作执行完成就直接返回“写入成功”的响应,会出现接口返回成功但实际业务逻辑执行失败的逻辑不一致问题
  4. 小问题:响应内容中的Writting为拼写错误,正确拼写为Writing

修复方案

  1. 把相对路径改为用__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:36:03