分享
三行代码  ›  专栏  ›  技术社区  ›  Mike K.

从firebase函数上传数据到firebase存储器?

  •  0
  • Mike K.  · 技术社区  · 7 月前

    我有一个运行node.js的网站,后端运行Firebase函数。我想将一组JSON存储到Firebase存储。当我在本地主机上运行时,下面的代码片段工作得很好,但是当我将它上传到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});
        });
    
    2 回复  |  直到 7 月前
        1
  •  1
  •   Doug Stevenson    7 月前

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

    那就是 os.tmpdir() 在节点中。在 documentation :

    文件系统唯一可写的部分是/tmp目录,它 可以使用在函数实例中存储临时文件。这是一个 存储在内存中。注意它会消耗内存 为函数配置的资源。

    顺便说一下,如果你想上传的数据在内存中,你不必像现在这样先把它写到文件中。你可以用 file.save() 为了这个。

        2
  •  0
  •   Olalekan    7 月前

    另一种方法是将JSON文件转换成一个缓冲区,然后执行这样的操作(下面的代码片段)。我写了一篇关于如何使用Google云存储来实现这一点的文章,但是它在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)
    })