- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试访问存储在我的 Firebase 存储中的文件,以将文件列表返回到我的 APK。我制作了一个云功能,但它无法正常工作,即使一切似乎都已解决。
index.js
const {Storage} = require('@google-cloud/storage');
const functions = require('firebase-functions');
const images = require('./images.js');
const storage = new Storage({
projectId: '<my_id>',
keyFilename: './key.json',
});
const bucket = storage.bucket('<my_bucket>')
exports.getImages = functions.https.onRequest((request, response) => {
images.getImages(bucket).then(urls => response.send(urls))
})
images.js
module.exports = {
getImages
}
const query = {
directory: '/images'
};
async function getImages(bucket) {
return bucket.getFiles(query).then(files => {
console.log(files)
getUrls(files).then(urls => console.log(urls))
.catch(() => console.error('URLs failure'));
}).catch(() => console.error('Files failure'));
}
function getUrls(files) {
const promises = []
files.forEach(file => promises.push(file.getDownloadURL()))
return Promise.all(promises);
}
我的 Key.json
位于我的函数文件夹中
Key.json
{
"type": "service_account",
"project_id": "…”,
"private_key_id": “…”,
"private_key": "-----BEGIN PRIVATE KEY——…”,
"client_email": “…”,
"client_id": “…”,
"auth_uri": “…”,
"token_uri": “…”,
"auth_provider_x509_cert_url": “…”,
"client_x509_cert_url": “…”
}
存储规则
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if true
}
}
}
执行getImages()
函数输出为:
console.log(files): [ [] ]
console.error('Files failure'): Files failure
请问我做错了什么?
最佳答案
我遇到的第一个主要问题是与我的 Google 云服务连接,这意味着:
下载文件并将我的项目确定为我的新 Key.json
然后是最棘手的部分。根据Google的文档
You can use the bucket references returned by the Admin SDK in conjunction with the official Google Cloud Storage client libraries to upload, download, and modify content in the buckets associated with your Firebase projects. Note that you do not have to authenticate Google Cloud Storage libraries when using the Firebase Admin SDK. The bucket references returned by the Admin SDK are already authenticated with the credentials used to initialize your Firebase app.
这意味着,如果您在本地运行服务 (npm run shell
),则需要实例化您的 firebase-admin
。
var serviceAccount = require("./key.json");
var admin = require("firebase-admin");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://<my_project>.firebaseio.com"
});
然后调用
const bucket = admin.storage().bucket('<my_bucket>.appspot.com')
您将准备好访问您的文件。通过部署或从 cloud console 直接访问您的 google 函数时,然后访问您的存储不需要 admin
初始化或 key 本身,例如问题上第一个公开的 index.js
,只需将代码变成类似
const {Storage} = require('@google-cloud/storage');
...
const storage = new Storage({
projectId: '<my_id>',
});
const bucket = storage.bucket('<my_bucket>')
...
关于 Mayeru
所说的话:
you have specified the directory as "/images" but instead it should be "images/"
"images/"
可用于查询prefix
参数,而不是directory
。 This示例显示了它是如何工作的,例如 its reference谷歌的文档也是如此。
以下代码经过一些 promise 调整并为 Android 解析 JSON 数据,效果非常好。本地和远程。
index.js
var serviceAccount = require("./key.json");
const functions = require('firebase-functions');
const images = require('./images.js');
var admin = require("firebase-admin");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://<my_project>.firebaseio.com"
});
const bucket = admin.storage().bucket('<my_bucket>.appspot.com')
exports.getImages = functions.https.onRequest((request, response) => {
images.getImages(bucket)
.then(urls => response.status(200).send({ data: { urls } }))
.catch(err => console.error(err));
})
images.js
module.exports = {
getImages
}
const query = {
directory: 'images'
};
function getImages(bucket) {
return bucket.getFiles(query)
.then(response => getUrls(response))
.catch(err => console.error(err));
}
function getUrls(response) {
const promises = []
response.forEach( files => {
files.forEach (file => {
promises.push(getSignedUrl(file));
});
});
return Promise.all(promises).then(result => getParsedUrls(result));
}
function getSignedUrl(file) {
return file.getSignedUrl({
action: 'read',
expires: '09-01-2019'
})
}
function getParsedUrls(result) {
return JSON.stringify(result.map(mediaLink => createMedia(mediaLink)));
}
function createMedia(mediaLink) {
const reference = {};
reference.mediaLink = mediaLink[0];
return reference;
}
这肯定会列出您存储桶中 images
文件夹下的所有文件,并访问它们的签名下载 url,以使用 Fresco
等库呈现。最后但并非最不重要的是,下载 URL 将被公开,但要直接在其上发出 GET
请求将需要调整您的存储桶权限。无论如何,这个“权限问题”是另一个主题,您也可以在堆栈溢出时找到如何做到这一点。
关于javascript - Google Cloud Function - 为什么 bucket 总是返回空文件数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57261867/
我是一名优秀的程序员,十分优秀!