将数据从Firebase函数上传到Firebase存储吗?

问题描述 投票:0回答:1

我有一个使用node.js运行的网站,其后端在Firebase Functions上运行。我想将一堆JSON存储到Firebase Storage。当我在localhost上运行时,以下代码片段可以正常工作,但是当我将其上传到Firebase函数时,它表示Error: EROFS: read-only file system, open 'export-stock-trades.json。有人知道如何解决这个问题吗?

    fs.writeFile(fileNameToReadWrite, JSON.stringify(jsonObjToUploadAsFile), function(err){
        bucket.upload(fileNameToReadWrite, {
            destination: destinationPath,
        });

        res.send({success: true});
    });
node.js firebase google-cloud-functions firebase-storage
1个回答
0
投票

我不确定,因为您的函数的大部分上下文都丢失了,但是看起来您的函数正在尝试先将文件写入本地磁盘(fs.writeFile),然后再上载文件(bucket.upload )。

在云功能上,您编写的代码仅具有对/ tmp的写权限,这是节点中的os.tmpdir()。阅读更多有关documentation

文件系统的唯一可写部分是/ tmp目录,该目录您可以用来在函数实例中存储临时文件。这是一个本地磁盘安装点,称为“ tmpfs”卷,在其中写入数据将该卷存储在内存中。请注意,它将消耗内存为该功能提供的资源。

这可能是导致代码失败的原因。

顺便说一句,如果您要上传的数据在内存中,则无需像现在这样先将其写入文件。您可以改为使用file.save()


0
投票

我认为这可行的另一种方法是将JSON文件转换为缓冲区,然后执行类似的操作(下面的代码段)。我写了一篇文章,介绍如何使用Google Cloud Storage进行此操作,但它在Firebase存储中工作正常。您唯一需要更改的是“ service-account-key.json”文件。

文章的链接可以在这里找到:Link to article on medium

const util = require('util')
const gc = require('./config/')
const bucket = gc.bucket('all-mighti') // should be your bucket name

/**
 *
 * @param { File } object file object that will be uploaded
 * @description - This function does the following
 * - It uploads a file to the image bucket on Google Cloud
 * - It accepts an object as an argument with the
 *   "originalname" and "buffer" as keys
 */

export const uploadImage = (file) => new Promise((resolve, reject) => {
  const { originalname, buffer } = file

  const blob = bucket.file(originalname.replace(/ /g, "_"))
  const blobStream = blob.createWriteStream({
    resumable: false
  })
  blobStream.on('finish', () => {
    const publicUrl = format(
      `https://storage.googleapis.com/${bucket.name}/${blob.name}`
    )
    resolve(publicUrl)
  })
  .on('error', () => {
    reject(`Unable to upload image, something went wrong`)
  })
  .end(buffer)
})
© www.soinside.com 2019 - 2024. All rights reserved.