NestJS使用fs读取文件报错ENOENT: no such file or directory
NestJS fs读取文件报ENOENT不存在异常修复
问题表现
使用Node.js内置fs模块实现文件读取逻辑时,普通txt文件、证书密钥文件均无法正常读取,运行时抛出错误:
ERROR [ExceptionsHandler] ENOENT: no such file or directory
异常触发代码如下:
import {FireblocksSDK, PeerType, TransactionArguments, TransactionOperation, TransactionStatus} from "fireblocks-sdk"; import fs = require('fs'); import path = require('path'); function fireblocks() { const text = fs.readFileSync(('./data.txt'), 'utf8'); console.log(text); const apiSecret = fs.readFileSync(path.resolve(__dirname, "../../certs/fireblocks_secret.key"), "utf8"); return new FireblocksSDK(apiSecret, process.env.FIREBLOCKS_ACCESS_TOKEN); }
项目文件结构参考:
问题根因
- 裸写的
./data.txt相对路径不与当前代码文件位置绑定,Node.js解析该路径时参考的是进程启动时的工作目录,NestJS本地启动时工作目录默认是执行启动命令的项目根目录,若data.txt未直接放在项目根目录,就会触发找不到文件的错误。 - 证书路径用
__dirname拼接时层级计算错误:NestJS基于TypeScript开发,源码编译后会输出到dist目录,__dirname在运行时对应的是编译后JS文件在dist内的路径,手写的../../certs/层级和编译后的实际目录结构不匹配,无法定位到密钥文件。
修复方案
- 废弃裸相对路径写法,统一路径拼接规则,优先用进程工作目录作为基准路径读取项目内静态文件,不受TS编译输出目录影响:
- 读取普通txt文件:如果data.txt存放在项目根目录,改成如下写法
const text = fs.readFileSync(path.join(process.cwd(), 'data.txt'), 'utf8'); - 读取证书密钥:certs目录默认放在项目根目录时,直接按根目录层级拼接即可,不需要手动计算相对层级
const apiSecret = fs.readFileSync(path.join(process.cwd(), "certs/fireblocks_secret.key"), "utf8");
- 读取普通txt文件:如果data.txt存放在项目根目录,改成如下写法
- 额外校验项:
- 确认
certs目录、data.txt没有被.gitignore、.dockerignore规则过滤,构建、部署时会被同步到运行环境的对应目录 - 如果是本地开发,执行启动命令时的终端路径必须是项目根目录,避免
process.cwd()取值异常
- 确认
内容的提问来源于stack exchange,提问作者Mabel Oza
相关产品推荐
相关产品推荐

