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

NestJS配置HTTPS时Node.js FS找不到SSL证书文件报ENOENT错误

配置NestJS HTTPS时读取证书文件抛出如下错误:

ENOENT: no such file or directory, open './secrets/localhost.crt'

问题根因

fs.readFileSync传入./开头的相对路径时,路径解析基准是Node进程启动时的终端工作目录,不是当前main.ts文件所在的目录。NestJS默认会将TS文件编译输出到dist目录,启动时工作目录如果和预期不一致,就会出现上述文件找不到的错误。
从目录结构判断,secrets证书文件夹存放在项目根目录(和package.json、src目录同级),原代码里的相对路径无法稳定定位到目标文件。

修复方案

使用Node.js内置的path模块拼接绝对路径,优先用process.cwd()获取项目根目录(NestJS启动时该方法固定返回package.json所在的根目录路径,不受代码文件位置、启动命令参数影响),修改后的main.ts代码如下:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as fs from 'fs'
import * as path from 'path'

async function bootstrap() {
  // 拼接证书文件的绝对路径,兼容Windows/macOS/Linux不同系统的路径分隔符
  const httpsOptions = {
    cert: fs.readFileSync(path.join(process.cwd(), 'secrets', 'localhost.crt')),
    key: fs.readFileSync(path.join(process.cwd(), 'secrets', 'localhost.key'))
  }

  const app = await NestFactory.create(AppModule, {
    httpsOptions
  });

  // 原代码未定义port变量,此处补充默认端口,可根据需求修改
  await app.listen(3000);
}

bootstrap();
排查&注意事项
  • 如果修改后仍报错,可以在读取文件前加一行调试代码打印实际解析的路径,确认路径是否正确:
    const certPath = path.join(process.cwd(), 'secrets', 'localhost.crt')
    console.log('证书路径:', certPath, '是否存在:', fs.existsSync(certPath))
    
  • 不要把证书这类不需要编译的静态资源放在src目录下,NestJS默认只会编译TS文件,不会自动拷贝其他格式文件到dist输出目录,运行编译后的代码时依然会报文件不存在
  • 不建议用__dirname拼接根目录资源路径:__dirname指向当前执行的JS文件所在目录,如果你修改了tsconfig里的编译输出目录,路径层级就会计算错误,稳定性不如process.cwd()

内容的提问来源于stack exchange,提问作者Muhamad Iqbal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:03:28