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

fs.writeFileSync创建文件后上传Firebase Storage遇报错,求解决方法

问题解答

1. fs.writeFileSync创建的文件存储位置

当你使用fs.writeFileSync(fileName, content)时:

  • 如果fileName是相对路径(比如'widget-62a6e3d160781a477aea435c.js'),文件会被写入当前Node.js进程的工作目录(也就是你执行node xxx.js命令时所在的文件夹)。
  • 如果fileName是绝对路径,则会写入指定的绝对路径位置。

你能通过fs.readFileSync读取到内容,说明文件确实已写入磁盘,ENOENT错误大概率是因为Firebase Storage的bucket.upload方法查找文件时,使用的工作目录和你本地测试时不一致(比如云函数环境的工作目录可能不同)。

2. 正确上传文件到Firebase Storage的方法

你的代码出现两个核心错误:

  • 错误1:直接传fs.readFileSync的返回值(字符串/Buffer)给bucket.upload,但该方法第一个参数要求是文件路径字符串,而非文件内容。
  • 错误2:传fs.createReadStream实例给bucket.upload,不符合参数类型要求,因此报类型错误。

方法一:通过文件路径直接上传(文件已写入磁盘)

如果已经用fs.writeFileSync创建了文件,直接传入文件路径即可:

// 确保fileName是正确的相对/绝对路径
bucket.upload(fileName, {
  destination: 'storage目标路径/widget-xxx.js' // 可选,指定文件在Storage中的存储路径和名称
})
.then(() => {
  console.log('文件上传成功');
})
.catch(err => {
  console.error('上传失败:', err);
});

如果仍出现ENOENT错误,建议打印当前工作目录确认文件位置:

console.log('当前工作目录:', process.cwd());

也可以改用绝对路径创建和上传文件,避免路径歧义:

const path = require('path');
// 生成脚本所在目录的绝对路径
const absoluteFileName = path.join(__dirname, fileName);
fs.writeFileSync(absoluteFileName, widgetContent);
// 上传时使用绝对路径
bucket.upload(absoluteFileName);

方法二:跳过磁盘写入,直接上传缓冲区内容

如果不需要将文件写入本地磁盘,可直接用widgetContent的Buffer或字符串上传,使用bucket.file().createWriteStream方法:

const file = bucket.file('storage目标路径/widget-xxx.js');
const writeStream = file.createWriteStream({
  metadata: {
    contentType: 'application/javascript' // 指定文件MIME类型,确保浏览器能正确识别
  }
});

writeStream.on('finish', () => {
  console.log('文件上传成功');
});
writeStream.on('error', (err) => {
  console.error('上传失败:', err);
});

// 写入内容,字符串会自动转换为Buffer
writeStream.write(widgetContent);
writeStream.end();

这种方式直接在内存中处理内容,无需写入本地磁盘,更适合临时文件的上传场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 12:36:16