Node.js运行报错:ENOENT no such file or directory, scandir './static/reports'
报错原因
该ENOENT错误是程序运行时无法找到./static/reports目录导致的,核心触发原因通常有两个:
- 相对路径解析逻辑不兼容容器环境
代码中使用的./static/reports是相对路径,解析基准是进程启动时的工作目录,Docker容器的默认工作目录和本地开发环境不一致,就会出现路径匹配失败。你代码中express.static已经用了__dirname拼接绝对路径,读取目录的逻辑也要保持一致才不会出错。 - Docker镜像未包含对应目录
如果打包Docker镜像时没有把static目录复制到镜像内的对应路径,运行时自然找不到该目录。
解决方案
- 首先修改路径读取逻辑,改用绝对路径拼接,可提前判断目录不存在时自动创建:
const express = require('express'); const app = express(); const db = require('./persistence'); const fs = require('fs'); const path = require('path'); // 拼接绝对路径,和express.static的路径规则保持一致 const reportPath = path.join(__dirname, './static/reports'); // 目录不存在时自动创建,recursive参数支持多级目录创建 if (!fs.existsSync(reportPath)) { fs.mkdirSync(reportPath, { recursive: true }); } const files = fs.readdirSync(reportPath); app.use(require('body-parser').json()); app.use(express.static(path.join(__dirname, '/static'))); db.init().then(() => { app.listen(3000, () => console.log('Listening on port 3000')); }).catch((err) => { console.error(err); process.exit(1); }); const gracefulShutdown = () => { db.teardown() .catch(() => {}) .then(() => process.exit()); }; process.on('SIGINT', gracefulShutdown); process.on('SIGTERM', gracefulShutdown); process.on('SIGUSR2', gracefulShutdown); // Sent by nodemon
- 然后检查你的Dockerfile配置,确保打包时已经把项目根目录的
static文件夹复制到了容器内/app/src/路径下,示例配置参考:
WORKDIR /app # 复制所有项目文件到容器工作目录 COPY . . # 若上面的COPY规则没覆盖static目录,单独增加一行 COPY ./static /app/src/static
内容的提问来源于stack exchange,提问作者user16953756
相关产品推荐
相关产品推荐

