使用文件流和 Firebase 云功能上传文件 + 云存储
File upload with filestreams and Firebase cloud functions + cloud storage
我使用 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' }
您似乎没有正确初始化管理 SDK。只需调用不带参数的 initializeApp 即可获得所有正确的默认值:
admin.initializeApp();
这将使用 Cloud Functions 为您的项目提供的默认服务帐户。此帐户有权执行您在函数中需要执行的大部分操作,无需任何额外配置。
我遇到了同样的问题。我刚刚在初始化应用程序时添加了 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
在命令行上
2020 年 4 月 6 日更新
签名 URL 实际上会在 7 天后过期。如果您需要更多时间的 URL,您应该阅读此 and this thread
在我的情况下,它与 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()。
我在将图像上传到 Firebase 存储时遇到同样的问题:
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.
ndlers\users.js:130:8)
at Busboy.emit (events.js:189:13)
at Busboy.emit (E:\react-project\socialape-functions\functions\node_modules\busboy\lib\main.js:37:33)
at E:\react-project\socialape-functions\functions\node_modules\busboy\lib\types\multipart.js:52:13
at 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 };
将存储桶添加到管理功能后,它就可以工作了。
你应该改变
storageBucket:“您在 firebase 存储中给出的存储桶名称”
至
存储桶:“。appspot.com”。
您可以找到BUCKET_NAME如下图:
我使用 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' }
您似乎没有正确初始化管理 SDK。只需调用不带参数的 initializeApp 即可获得所有正确的默认值:
admin.initializeApp();
这将使用 Cloud Functions 为您的项目提供的默认服务帐户。此帐户有权执行您在函数中需要执行的大部分操作,无需任何额外配置。
我遇到了同样的问题。我刚刚在初始化应用程序时添加了 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
在命令行上
2020 年 4 月 6 日更新
签名 URL 实际上会在 7 天后过期。如果您需要更多时间的 URL,您应该阅读此
在我的情况下,它与 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()。
我在将图像上传到 Firebase 存储时遇到同样的问题:
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. ndlers\users.js:130:8) at Busboy.emit (events.js:189:13) at Busboy.emit (E:\react-project\socialape-functions\functions\node_modules\busboy\lib\main.js:37:33) at E:\react-project\socialape-functions\functions\node_modules\busboy\lib\types\multipart.js:52:13 at 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 };
将存储桶添加到管理功能后,它就可以工作了。
你应该改变
storageBucket:“您在 firebase 存储中给出的存储桶名称”
至
存储桶:“
您可以找到BUCKET_NAME如下图: