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

Я написал следующий код для загрузки своего QR-файла с использованием облачных функций Firebase

const functions = require('firebase-functions');
const qrcode = require('qrcode')
const admin = require('firebase-admin');
const spawn = require('child-process-promise').spawn;
const serviceAccount = require("./secret.json");
const gcs = require('@google-cloud/storage')();

admin.initializeApp(functions.config({
  credential: admin.credential.cert(serviceAccount),
  storageBucket: "https://SECRET.firebaseio.com"
}));


exports.qrcode = functions.https.onRequest((req, res) => {
  const storage = admin.storage().bucket();
  const dummyFile = storage.file('dummy.png')
  new Promise ((resolve, reject) => qrcode.toFileStream(
    dummyFile.createWriteStream()
      .on('finish', resolve)
      .on('error', reject),
    'DummyQR'))
    .then(console.log("success")) //Doing stuff here later
    .catch(console.log)
  res.send("<script>window.close();</script>")
});

В соответствии с документами, я должен иметь возможность подключиться к корзине, просто вызвав admin.storage().bucket(); (https://firebase.google.com/docs/storage/admin/start) однако я получаю следующую ошибку:

Error: Error occurred while parsing your function triggers.

Error: Bucket name not specified or invalid. Specify a valid bucket name via the storageBucket option when initializing the app, or specify the bucket name explicitly when calling the getBucket() method.

и поэтому я застрял и не уверен, что делать дальше. Если я пытаюсь вручную ввести ведро admin.storage().bucket("https://SECRET.firebaseio.com");, я получаю ошибку

{ ApiError: Not Found
    at Object.parseHttpRespBody (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:193:30)
    at Object.handleResp (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:131:18)
    at /user_code/node_modules/firebase-admin/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:496:12
    at Request.onResponse [as _callback] (/user_code/node_modules/firebase-admin/node_modules/retry-request/index.js:195:7)
    at Request.self.callback (/user_code/node_modules/firebase-admin/node_modules/request/request.js:185:22)
    at emitTwo (events.js:106:13)
    at Request.emit (events.js:191:7)
    at Request.<anonymous> (/user_code/node_modules/firebase-admin/node_modules/request/request.js:1157:10)
    at emitOne (events.js:96:13)
    at Request.emit (events.js:188:7)
  code: 404,
  errors: [ { domain: 'global', reason: 'notFound', message: 'Not Found' } ],
  response: undefined,
  message: 'Not Found' }

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

У меня была такая же проблема.Я просто добавил имя storageBucket при инициализации приложения, и если вы используете метод getSignedUrl, вам нужно включить учетную запись службы, в противном случае этот URL истечет через неделю (как это было в моем случае).

const serviceAccount = require('/your/service/account/key/path');
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    storageBucket: "your-storage-bucket-name.appspot.com",
});

не забудьте обновить свои функции firebase с помощью

firebase deploy --only functions

в командной строке

0 голосов
/ 07 июня 2018

Похоже, вы неправильно инициализируете административный SDK.Просто вызовите initializeApp без параметров, чтобы получить все правильные значения по умолчанию:

admin.initializeApp();

При этом будет использоваться учетная запись службы по умолчанию, предоставляемая Cloud Functions для вашего проекта.Эта учетная запись имеет право выполнять большую часть того, что вам нужно сделать в вашей функции, без какой-либо дополнительной настройки.

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