如何在Heroku托管环境中使用fs模块创建PNG文件并解决ENOENT报错
导致ENOENT: no such file or directory报错的核心原因是相对路径基准不匹配、异常未捕获,可按以下方案修复:
1. 替换相对路径为绝对路径
你当前使用的./pictures是相对路径,基准是Node进程启动时的工作目录,并非你编写代码的JS文件所在目录,只要你启动服务的目录发生变化,就会出现路径识别错误。
先引入Node内置的path模块:
const path = require('path')
修改图片路径的生成逻辑,用当前文件的绝对目录__dirname拼接路径:
const imageDir = path.join(__dirname, 'pictures', `${generatedImageId}.png`)
如果你使用ESM模块规范,没有__dirname变量,可以用以下方式拼接:
const imageDir = path.join(path.dirname(new URL(import.meta.url).pathname), 'pictures', `${generatedImageId}.png`)
2. 补充异常捕获逻辑
你当前的代码没有监听文件写入流的错误事件,出现异常时无法拿到具体报错信息,修改download函数逻辑:
var download = function(uri, filename, callback){ request.head(uri, function(err, res, body){ // 新增head请求错误判断 if (err) { console.error('资源请求失败:', err) return callback(err) } console.log('content-type:', res.headers['content-type']); console.log('content-length:', res.headers['content-length']); const writeStream = fs.createWriteStream(filename) // 新增文件写入错误监听 writeStream.on('error', (writeErr) => { console.error('文件写入失败:', writeErr) callback(writeErr) }) request(uri).pipe(writeStream).on('close', () => callback(null)); }); };
3. 额外排查点
确认你创建的pictures文件夹和代码文件在同一级目录,且运行Node进程的用户对该文件夹有读写权限,Linux/macOS环境下权限不足也会触发同类报错。
内容的提问来源于stack exchange,提问作者Igor Duca
相关产品推荐
相关产品推荐

