使用文件流和Firebase云功能+云存储

时间:2018-06-07 15:33:33

标签: firebase google-cloud-storage google-cloud-functions firebase-admin

我使用firebase云功能为我的QR文件上传编写了以下代码

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' }

5 个答案:

答案 0 :(得分:3)

我有同样的问题。我只是在初始化应用程序时添加了storageBucket名称,如果您使用的是getSignedUrl方法,则需要包括一个服务帐户,否则该网址将在一周后过期(就像我的情况一样)。

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

在命令行上

答案 1 :(得分:2)

您好像没有正确初始化管理员SDK。只需调用不带参数的initializeApp即可获得所有正确的默认值:

admin.initializeApp();

看起来您需要使用代码初始化服务帐户,所以不要为此烦恼。

答案 2 :(得分:0)

在我的情况下,这与this one类似(在使用firebase-admin初始化应用程序时无法在未指定storageBucket的情况下使用云存储)

我进行了以下设置:

const admin = require("firebase-admin")
admin.initializeApp()

export * from "./api/api"
export * from "./cron/cronJobs"
export * from "./posts/postsCloudFunctions"

将其更改为:

const admin = require("firebase-admin")

export * from "./api/api"
export * from "./cron/cronJobs"
export * from "./posts/postsCloudFunctions"

admin.initializeApp()

似乎问题是在访问存储桶之前未调用initializeApp()。

答案 3 :(得分:0)

将图像上传到Firebase存储时遇到相同的问题:

错误:存储桶名称未指定或无效。在初始化应用程序时,通过storageBucket选项指定有效的存储桶名称,或者在调用getBucket()方法时显式指定存储桶名称。 ndlers \ users.js:130:8) 在Busboy.emit(events.js:189:13) 在Busboy.emit(E:\ react-project \ socialape-functions \ functions \ node_modules \ busboy \ lib \ main.js:37:33) 在E:\ react-project \ socialape-functions \ functions \ node_modules \ busboy \ lib \ types \ multipart.js:52:13 在process._tickCallback(internal / process / next_tick.js:61:11)

然后我将storageBucket添加到管理功能

var admin = require("firebase-admin");
var serviceAccount = require("your service account key file path);

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://your-app-1234.firebaseio.com",
  storageBucket: "your-storage-bucket-name given in firebase storage"
});

const db = admin.firestore();

module.exports = { admin, db };

将存储桶添加到管理功能后,它可以工作。

答案 4 :(得分:0)

您应该更改

storageBucket:“您在Firebase存储中指定的存储桶名称”

storageBucket:“ .appspot.com”。

您可以在下面的图片中找到BUCKET_NAME:

enter image description here