Проблема с доступом к файлу в Firebase Storage с помощью Firebase Cloud Functions, файл возвращает «[объект объекта]» - PullRequest
0 голосов
/ 15 января 2020

При попытке получить доступ к изображению в моем домашнем каталоге хранилища Firebase с помощью функций node.js я получаю [объект объекта] в качестве ответа. Я полагаю, что я неправильно инициализировал корзину, но не уверен, в чем дело.

Это отладочная информация в функциях firebase:

ChildProcessError: `composite -compose Dst_Out [object Object] [object Object] /tmp/output_final2.png` failed with code 1

Вот мой код:

const admin = require('firebase-admin');
admin.initializeApp();
const storage = admin.storage();


const os = require('os');
const path = require('path');
const spawn = require('child-process-promise').spawn;


exports.onFileChange= functions.storage.object().onFinalize(async object => {

    const bucket = storage.bucket('myID.appspot.com/');
    const contentType = object.contentType;
    const filePath = object.name;
    console.log('File change detected, function execution started');

    if (object.resourceState === 'not_exists') {
        console.log('We deleted a file, exit...');
        return;
    }

    if (path.basename(filePath).startsWith('changed-')) {
        console.log('We already changed that file!');
        return;
    }

    const destBucket = bucket;
    const tmpFilePath = path.join(os.tmpdir(), path.basename(filePath));
    const border = bucket.file("border.png");
    const mask1 = bucket.file("mask1.png");
    const metadata = { contentType: contentType };
    return destBucket.file(filePath).download({
        destination: tmpFilePath
    }).then(() => {
        return spawn('composite', ['-compose', 'Dst_Out', mask1, border, tmpFilePath]);

    }).then(() => {
        return destBucket.upload(tmpFilePath, {
            destination: 'changed-' + path.basename(filePath),
            metadata: metadata
        })
    }); });```


Ответы [ 2 ]

1 голос
/ 15 января 2020

Если при

const bucket = storage.bucket('myID.appspot.com/');

ваша цель состоит в том, чтобы инициализировать контейнер по умолчанию , вам нужно просто сделать

const bucket = storage.bucket();

, так как вы объявили storage as admin.storage()


ОБНОВЛЕНИЕ (после вашего комментария о const border = bucket.file("border.png");)

Кроме того, просматривая код аналогичного облака Функция (из официальных образцов, использующих ImageMagick и spawn) показывает, что вам не следует переходить на метод spawn() some File объекты, созданные с помощью метода file() облачного хранилища Node.js клиентского API (т.е. const border = bucket.file("border.png");), но некоторые файлы, которые вы ранее сохранили во временный каталог.

Посмотрите на следующую выдержку из примера облачной функции, упомянутого выше. Они определяют временные каталоги и пути к файлам (используя модуль path), загружают файлы в этот каталог и используют их для вызова метода spawn().

  //....
  const filePath = object.name;
  const contentType = object.contentType; // This is the image MIME type
  const fileDir = path.dirname(filePath);
  const fileName = path.basename(filePath);
  const thumbFilePath = path.normalize(path.join(fileDir, `${THUMB_PREFIX}${fileName}`));   // <---------
  const tempLocalFile = path.join(os.tmpdir(), filePath);    // <---------
  const tempLocalDir = path.dirname(tempLocalFile);     // <---------
  const tempLocalThumbFile = path.join(os.tmpdir(), thumbFilePath);     // <---------

  //....

  // Cloud Storage files.
  const bucket = admin.storage().bucket(object.bucket);
  const file = bucket.file(filePath);
  const thumbFile = bucket.file(thumbFilePath);
  const metadata = {
    contentType: contentType,
    // To enable Client-side caching you can set the Cache-Control headers here. Uncomment below.
    // 'Cache-Control': 'public,max-age=3600',
  };

  // Create the temp directory where the storage file will be downloaded.
  await mkdirp(tempLocalDir)   // <---------
  // Download file from bucket.
  await file.download({destination: tempLocalFile});    // <---------
  console.log('The file has been downloaded to', tempLocalFile);
  // Generate a thumbnail using ImageMagick.
  await spawn('convert', [tempLocalFile, '-thumbnail', `${THUMB_MAX_WIDTH}x${THUMB_MAX_HEIGHT}>`, tempLocalThumbFile], {capture: ['stdout', 'stderr']});   
  //.....
0 голосов
/ 15 января 2020

Вы не можете передавать объекты типа Cloud Storage File в spawn. Вам нужно передать строки, которые будут использоваться для создания командной строки. Это означает, что вам нужно загрузить эти файлы локально в / tmp, прежде чем вы сможете работать с ними - ImageMagick не знает, как работать с файлами в облачном хранилище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...