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

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");
      
  • 额外校验项:
    • 确认certs目录、data.txt没有被.gitignore、.dockerignore规则过滤,构建、部署时会被同步到运行环境的对应目录
    • 如果是本地开发,执行启动命令时的终端路径必须是项目根目录,避免process.cwd()取值异常

内容的提问来源于stack exchange,提问作者Mabel Oza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:15:37