Node.js ENOENT错误:无法读取server下resources文件夹中的图片
问题原因及解决办法
核心问题1:相对路径解析逻辑不对
你用的相对路径../../resources/cp_pdf_logo.png是基于**Node.js进程的工作目录(CWD)**来解析的,不是基于当前脚本文件的位置。本地开发时你的工作目录可能刚好和脚本目录层级匹配,但生产服务器上,启动服务的工作目录大概率和本地不一样,导致解析出来的路径根本不存在,所以报ENOENT错误。而绝对路径/app/resources/...直接指定了文件的真实位置,所以能正常工作。
核心问题2:require不能直接导入图片
Node.js的require是用来加载JS、JSON这类模块文件的,本身不支持导入图片这类二进制静态资源。除非你用Webpack、Vite这类打包工具做了配置,把图片转成base64或者资源路径,但纯Node服务场景下直接用require导入图片肯定会失败。
解决办法
1. 用脚本文件的绝对路径来构建资源路径
不管工作目录是什么,基于当前脚本的位置来拼绝对路径就不会错:
如果是CommonJS模块:
const path = require('path'); const logoPath = path.join(__dirname, '../../resources/cp_pdf_logo.png'); // 之后用fs.readFile(logoPath, ...)读取即可__dirname是Node.js提供的变量,代表当前脚本文件所在的目录,用path.join拼接路径能自动处理不同系统的路径分隔符(Windows的\和Linux的/)。如果是ES模块(用import/export):
ES模块没有__dirname,需要手动转换:import path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const logoPath = path.join(__dirname, '../../resources/cp_pdf_logo.png');
2. 验证路径是否正确
可以在代码里加一行打印,确认生产环境下生成的路径对不对:
console.log('Logo文件路径:', logoPath);
部署后看日志,检查这个路径是不是对应服务器上图片的真实位置。
3. 读取图片用fs模块,别用require
如果是后端服务需要读取图片内容,直接用fs.readFile或者fs.createReadStream配合上面的正确路径就行,完全不需要用require。
内容的提问来源于stack exchange,提问作者Niishaw
相关产品推荐
相关产品推荐

