【问题标题】:How can I get DownloadableURL from firebase storage using the internal storage location in node.js app?如何使用 node.js 应用程序中的内部存储位置从 firebase 存储中获取 DownloadableURL?
【发布时间】:2019-05-26 17:51:10
【问题描述】:

我对 firebase 比较陌生,目前正在开发 node.js (react-electron) 应用程序,我的目标是显示一些存储在 firebase-storage 中的图片。

在我的应用中,我知道 内部 firebase 存储 URL gs://myapp.appspot.com/folders/image.jpg 并希望获得 downloadableURL https://firebasestorage.googleapis.com/...

所以问题来了:我知道 firebase 存储中有 refFromURL()getDownloadURL() 方法,我打算这样做

import firebase from 'firebase';
import config from './firebaseConfig.json';
firebase.initializeApp(config);
var storage = firebase.storage();

function fetchTrueImgsrc(internalSrc) {
  if (internalSrc === undefined) return null;
  return storage.refFromURL(internalSrc).getDownloadURL();
}

我得到了这个

第 4 行:未捕获的 TypeError:firebase__WEBPACK_IMPORTED_MODULE_1___default.a.storage 不是函数

我发现 firebase.storage() 不再支持 node.js,https://firebase.google.com/docs/storage/web/start 上的所有文档对我来说完全没用

所以问题是,如果我不能使用 firebase.storage,我将如何在 node.js 客户端实现这一点?请帮忙。

我试过了:

const myappBucket='myapp.appspot.com';
import { Storage } from '@google-cloud/storage';
const bucket = new Storage().bucket(myappBucket);
const file = bucket.file(internalSrc); 
file
  .getSignedUrl({
    action: 'read',
    expires: '03-09-2491'
  })
  .then(signedUrls => {
    console.log('signed URL', signedUrls[0]); // this will contain the picture's url
    return;
  })
  .catch(err => console.error(err));
const myappBucket='myapp.appspot.com';
import config from './firebaseConfig.json';
import firebase_admin from 'firebase-admin';
firebase_admin.initializeApp(config);
var storage = firebase_admin.storage();
var bucket = storage.bucket(myappBucket);
bucket.file(internalSrc).getSignedUrl(
  {
    action: 'read',
    expires: '03-09-2491'
  },
  function(err, url) {
    if (err) {
      console.error(err);
    } else {
      console.log('Download model DL url: ' + url);
    }
  }
);

两者都有这个错误

SigningError:确定执行环境的意外错误:无法在 GoogleAuth 处获取。

我试图避免将 firebase 降级到 firebase@v4.7.0 但如果没有解决方案,我想我也应该尝试一下。

我正在使用: - “@google-cloud/storage”:“^2.5.0” - “火力基地”:“^6.0.2” - “firebase 管理员”:“^7.3.0” - “反应”:“^16.8.6” - “电子”:“^3.0.10”

谢谢。

【问题讨论】:

  • 只是为了确定,你想要你的文件传入参数的下载 url,对吧?
  • 是的,我传入 gs://myapp.appspot.com/folders/image.jpg 字符串作为参数并希望函数返回 https://firebasestorage.googleapis.com/... 作为可下载的 URL
  • > 你在哪里执行这段代码? > 您如何设置服务帐户?你用的是默认的还是其他的? > 该服务帐户的权限是什么?此服务帐号是否有权访问您尝试访问的存储分区?

标签: node.js electron google-cloud-storage firebase-storage


【解决方案1】:

这是一个代码示例,它在使用 ADMIN SDK 上传后返回文件的下载网址:

firebase.storage().bucket().upload('your/file', {
                destination: `where/you/want/it`,
            }).catch((error) => {
                throw error;
            }).then((result) => {
                result[0].getSignedUrl({
                    action: 'read'
                }).then((url) => {
                    url[0] // your url
                })
            });

这是完全相同的问题:Post

【讨论】:

  • 谢谢@DataHearth,但这不是我的本意。我已经有这个图片文件很久以前通过其他方法上传到存储中了。然后我在我的应用程序中有gs://... 字符串,它不是下载它的公共URL,所以我想要将其更改为可下载的URL,如https://firebasestorage.googleapis.com/v0/b/xxxxxxxxxx.appspot.com/o/Folder%2Fxxxxxx.png?alt=media&token=xxxxxxxxxx 或类似的东西,我可以通过去firebase 访问它控制台。
  • 顺便说一句,我已经尝试使用 firebase admin SDK 中的服务帐户,并且在 IAM 和管理员/谷歌云服务帐户平台中具有双重检查权限 - 授予云功能服务代理、服务帐户令牌创建者的权限, 编辑器等Code Snippets 还是得到这个错误> Uncaught (in promise) SigningError: Unexpected error determine execution environment: Failed to fetch
猜你喜欢
  • 2019-10-19
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2021-08-06
  • 2013-01-05
相关资源
最近更新 更多