Загрузка данных из функций Firebase в хранилище Firebase? - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть веб-сайт, работающий с 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});
    });

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Не могу сказать точно, так как большая часть контекста вашей функции отсутствует, но похоже, что ваша функция сначала пытается записать файл на локальный диск (fs.writeFile), а затем загрузить его (bucket.upload).

В облачных функциях код, который вы пишете, имеет доступ только для записи в / tmp, который равен os.tmpdir() в узле. Подробнее об этом читайте в документации :

Единственной записываемой частью файловой системы является каталог / tmp, который вы можете использовать для хранения временных файлов в экземпляре функции. Это точка монтирования локального диска, известная как том «tmpfs», в котором данные, записанные на том, хранятся в памяти. Обратите внимание, что он будет использовать ресурсы памяти, выделенные для этой функции.

Это, вероятно, причина вашего кода сбоя.

Кстати, если данные, которые вы хотите загрузить, находятся в памяти, вам не нужно сначала записывать его в файл, как вы это делаете сейчас. Вместо этого вы можете использовать file.save () для этого.

0 голосов
/ 14 февраля 2020

Еще один способ, по которому я чувствую, что это может сработать, - преобразовать файл JSON в буфер и затем выполнить действие, подобное этому (фрагмент кода ниже). Я написал статью о том, как вы можете сделать это, используя Google Cloud Storage, но он отлично работает с хранилищем Firebase. Единственное, что вам нужно изменить - это файл «service-account-key. json».

Ссылку на статью можно найти здесь: Ссылка на статью на носителе

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)
})
...