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
相关产品推荐
相关产品推荐

