Загрузка файлов из облачных функций Firebase в облачное хранилище - PullRequest
0 голосов
/ 04 ноября 2018

Документация слишком сложна для меня, чтобы понять. В нем показано, как загрузить файл из облачного хранилища в облачные функции, манипулировать им, а затем загрузить новый файл в облачное хранилище. Я просто хочу увидеть основные минимальные инструкции по загрузке файла из облачных функций в облачное хранилище. Почему это не работает:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp();

exports.storage = functions.firestore.document('Test_Value').onUpdate((change, context) => {

  var metadata = {
    contentType: 'text',
  };

  admin.storage().ref().put( {'test': 'test'}, metadata)
  .then(function() {
    console.log("Document written.");
  })
  .catch(function(error) {
    console.error(error);
  })

});

Сообщение об ошибке admin.storage(...).ref is not a function. Я предполагаю, что firebase-admin включает Firestore, но не Storage? Вместо firebase-admin я должен использовать @google-cloud/storage? Почему это не работает:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

const {Storage} = require('@google-cloud/storage')();
const storage = new Storage();

admin.initializeApp();

exports.storage = functions.firestore.document('Test_Value').onUpdate((change, context) => {

  storage.bucket().upload( {'test': 'test'} , {
    metadata: {
      contentType: 'text'
    }
  })

});

Я даже не могу развернуть этот код, сообщение об ошибке

Error parsing triggers: Cannot find module './clone.js'

Видимо, отсутствует зависимость от модуля npm? Но модуль не называется clone.js? Я пытался требовать child-process-promise, path, os и fs; никто не исправил отсутствующую clone.js ошибку.

Почему у admin.initializeApp(); нет параметров, когда в моем файле index.html есть:

firebase.initializeApp({
    apiKey: 'swordfish',
    authDomain: 'myapp.firebaseapp.com',
    databaseURL: "https://myapp.firebaseio.com",
    projectId: 'myapp',
    storageBucket: "myapp.appspot.com"
  });

Другая проблема, с которой я сталкиваюсь:

npm list -g --depth=0       

/Users/TDK/.nvm/versions/node/v6.11.2/lib
├── child_process@1.0.2
├── UNMET PEER DEPENDENCY  error: ENOENT: no such file or directory, open '/Users/TDK/.nvm/versions/node/v6.11.2/lib/node_modules/firebase-admin/package.json
├── firebase-functions@2.1.0
├── firebase-tools@6.0.1
├── firestore-backup-restore@1.3.1
├── fs@0.0.2
├── npm@6.4.1
├── npm-check@5.9.0
├── protractor@5.4.1
├── request@2.88.0
└── watson-developer-cloud@3.13.0

Другими словами, что-то не так с firebase-admin или с Node 6.11.2. Должен ли я использовать Node Version Manager, чтобы вернуться к более старой версии Node?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Я загрузил файл со своего жесткого диска в облачное хранилище Firebase через облачные функции Google. Сначала я нашел документацию для облачных функций Google bucket.upload .

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

exports.Storage = functions.firestore.document('Storage_Value').onUpdate((change, context) => {

  const {Storage} = require('@google-cloud/storage');
  const storage = new Storage();
  const bucket = storage.bucket('myapp.appspot.com');

  const options = {
    destination: 'Test_Folder/hello_world.dog'
  };

  bucket.upload('hello_world.ogg', options).then(function(data) {
    const file = data[0];
  });

  return 0;
});

Первые три строки представляют собой шаблон Cloud Functions. Следующая строка

exports.Storage = functions.firestore.document('Storage_Value').onUpdate((change, context) => {

создает функцию облака и устанавливает триггер. Следующие три строчки - это образец Google Cloud.

Остальная часть кода находит файл hello_world.ogg на жестком диске моего компьютера в папке functions каталога моего проекта, загружает его в каталог Test_Folder и изменяет имя файла на hello_world.dog в мое Firebase облачное хранилище. Это возвращает обещание, и следующая строка const file = data[0]; не нужна, если вы не хотите делать что-то еще с файлом.

Наконец мы return 0;. Эта строка ничего не делает, кроме сообщения об ошибке

Function returned undefined, expected Promise or Value
0 голосов
/ 05 ноября 2018

См. Введение в облачное хранилище администратора. API для дальнейшего подробности о том, как использовать службу облачного хранилища в Firebase Admin SDK.

var admin = require("firebase-admin");

var serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    storageBucket: "<BUCKET_NAME>.appspot.com"
});

var bucket = admin.storage().bucket();

// 'bucket' is an object defined in the @google-cloud/storage library.
// See https://googlecloudplatform.github.io/google-cloud-node/#/docs/storage/latest/storage/bucket
// for more details.

Что касается загрузки объектов, см. Документация по облачному хранилищу Загрузка объектов Пример кода:

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const filename = 'Local file to upload, e.g. ./local/path/to/file.txt';

// Uploads a local file to the bucket
await storage.bucket(bucketName).upload(filename, {
  // Support for HTTP requests made with `Accept-Encoding: gzip`
  gzip: true,
  metadata: {
    // Enable long-lived HTTP caching headers
    // Use only if the contents of the file will never change
    // (If the contents will change, use cacheControl: 'no-cache')
    cacheControl: 'public, max-age=31536000',
  },
});

console.log(`${filename} uploaded to ${bucketName}.`);
...