使用fs.readFileSync访问JSON文件抛出errno -4058,非模块方式如何解决?
首先明确:这个错误完全不是Windows系统特有的——Node.js解析相对路径的逻辑在所有平台上都是一致的:相对路径是基于当前工作目录(CWD),而不是你的脚本文件(loginservice.js)所在的目录。你遇到的问题,是代码里写的../configurationFile.json,Node.js会从你启动脚本的目录去查找,而非从loginservice.js所在的API/Services目录出发,自然找不到目标文件。
除了将配置封装为模块,你可以用这几种可靠方案解决:
1. 用__dirname构建绝对路径(最推荐的跨平台方案)
__dirname是Node.js内置变量,代表当前模块文件所在目录的绝对路径。结合path模块的join方法(自动适配不同平台的路径分隔符),能精准定位到配置文件:
先引入依赖模块:
const path = require('path'); const fileSystem = require('fs');
再修改读取逻辑:
// 从loginservice.js所在目录,往上两级回到API目录,再指向配置文件 const configPath = path.join(__dirname, '../../configurationFile.json'); const configurationFile = fileSystem.readFileSync(configPath); // 只解析一次,避免重复操作 const config = JSON.parse(configurationFile.toString()); const apiSecretKey = config.secret; const url = config.db_url; const dbName = config.db_name;
2. 直接用require加载JSON文件(最简洁的方式)
Node.js支持直接用require加载JSON文件,它会自动完成文件读取和JSON解析,而且require的路径是相对于当前模块的,不受工作目录影响:
const config = require('../../configurationFile.json'); const apiSecretKey = config.secret; const url = config.db_url; const dbName = config.db_name;
这种方式省去了手动调用fs和JSON.parse的步骤,代码更简洁可靠。
3. 基于项目根目录构建路径(需固定启动目录)
如果你确保总是从Back-End目录启动脚本(比如运行node index.js),可以用process.cwd()获取当前工作目录,再拼接路径:
const path = require('path'); const fileSystem = require('fs'); const configPath = path.join(process.cwd(), 'API/configurationFile.json'); const configurationFile = fileSystem.readFileSync(configPath); const config = JSON.parse(configurationFile.toString());
注意:这种方式有局限性——如果从其他目录启动脚本(比如Back-End/API目录),路径就会失效,所以优先级不如前两种。
额外说明
之所以说不是Windows特有,是因为不管Windows还是Linux/macOS,Node.js的相对路径解析逻辑都是以当前工作目录为基准,只是不同平台的路径分隔符不同(Windows用\,类Unix用/),但用path.join会自动处理这些差异,只要用正确的路径构建方式,跨平台都不会有问题。
内容的提问来源于stack exchange,提问作者supersam5

