Ошибка доступа к облачному хранилищу для Firebase admin.storage (). Ref не является функцией

Я работаю с облачным хранилищем для Firebase и не могу понять, как получить доступ к файлам хранилища.

Согласно https://firebase.google.com/docs/storage/web/start официальное руководство и https://firebase.google.com/docs/storage/web/create-reference этот код должен возвращать корневую ссылку

let admin = require('firebase-admin')
admin.initializeApp({...})
let storageRef = admin.storage().ref()

Но выдает ошибку:

TypeError: admin.storage (...). Ref не является функцией

package.json

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {...},
  "dependencies": {
    "@google-cloud/storage": "^1.5.1",
    "firebase": "^4.8.0",
    "firebase-admin": "~5.4.2",
    "firebase-functions": "^0.7.1",
    "pdfkit": "^0.8.3",
    "uuid": "^3.1.0"
  },
  "private": true
}

узел -v => v7.7.4

Моя конечная цель - скачать файлы или загрузить файл pdf в хранилище.


person Abdullah    schedule 14.12.2017    source источник
comment
ты на функциях? если да, используйте bucket = admin.storage().bucket(), администратор функций не использует веб-API   -  person Linxy    schedule 14.12.2017
comment
Спасибо за ответ, да, я могу получить доступ к ведру таким образом и могу получить доступ к файлу с помощью bucket.file('images/snow.jpg'), но я хочу вернуть / загрузить файл в ответ на облачную функцию. Вы можете помочь?   -  person Abdullah    schedule 14.12.2017
comment
Я пробовал bucket.file('images/snow.jpg').getDownloadURL(), но там написано bucket.file(...).getDownloadURL is not a function   -  person Abdullah    schedule 14.12.2017
comment
потому что это не так. См. Доступные функции: cloud.google.com/nodejs/docs/ reference / storage / 1.4.x / File   -  person Linxy    schedule 14.12.2017
comment
Привет .. Я все время получаю .. Ошибка: невозможно подписать данные без client_email. где я могу настроить client_email?   -  person rainversion_3    schedule 11.07.2020


Ответы (3)


Вы используете облачные функции и Firebase Admin SDK, чтобы попытаться получить доступ к своей корзине. В процитированном вами руководстве по началу работы говорится о клиентских веб-приложениях с веб-API для Firebase, а не административным. Функциональность там другая, потому что он использует другой SDK (даже если их имена совпадают).

Storage Объект, к которому вы пытаетесь получить доступ, не имеет ref() функций, только app и bucket().

https://firebase.google.com/docs/reference/admin/node/admin.storage.Storage

Попробуйте напрямую использовать API Google Cloud:

https://cloud.google.com/storage/docs/creating-buckets#storage-create-bucket-nodejs.

-

РЕДАКТИРОВАТЬ: это изменение предназначено только для того, чтобы перестать пугать людей публикацией двухлетней давности. Приведенный выше ответ по-прежнему актуален по состоянию на май 2020 года.

person Raeglan    schedule 20.05.2018
comment
Это прекрасное объяснение распространенной путаницы. Я думаю, что документация Firebase могла бы быть намного лучше. Ваш простой ответ позволил мне сэкономить много времени. Спасибо! - person Juan Antonio; 22.11.2018
comment
это все еще верно по состоянию на март 2020 года? Если нет, есть ли планы по включению API хранилища в sdk администратора? - person vir us; 09.03.2020
comment
По-прежнему актуально по состоянию на апрель 2020 года. Документация Firebase могла бы лучше осветить это. - person Ganesh; 05.04.2020
comment
firebase.google.com/docs/reference/admin/node/ ссылка не найдена, не могли бы вы обновить альтернативную ссылку? - person Praveen Aanand; 02.12.2020

В приведенном ниже примере я извлекаю ссылки на изображения из существующей коллекции Firestore, называемой «изображениями». Я делаю перекрестные ссылки на коллекцию «изображений» с коллекцией «сообщений», так что я получаю только изображения, относящиеся к определенному сообщению. Это не обязательно.

Документы для getSignedUrl ()

const storageBucket = admin.storage().bucket( 'gs://{YOUR_BUCKET_NAME_HERE}.appspot.com' )
const getRemoteImages = async() => {
    const imagePromises = posts.map( (item, index) => admin
        .firestore()
        .collection('images')
        .where('postId', '==', item.id)
        .get()
        .then(querySnapshot => {
            // querySnapshot is an array but I only want the first instance in this case
            const docRef = querySnapshot.docs[0] 
            // the property "url" was what I called the property that holds the name of the file in the "posts" database
            const fileName = docRef.data().url 
            return storageBucket.file( fileName ).getSignedUrl({
                action: "read",
                expires: '03-17-2025' // this is an arbitrary date
            })
        })
        // chained promise because "getSignedUrl()" returns a promise
        .then((data) => data[0]) 
        .catch(err => console.log('Error getting document', err))
    )
    // returns an array of remote image paths
    const imagePaths = await Promise.all(imagePromises)
    return imagePaths
}

Вот консолидированная важная часть:

const storageBucket = admin.storage().bucket( 'gs://{YOUR_BUCKET_NAME_HERE}.appspot.com' )
const fileName = "file-name-in-storage" // ie: "your-image.jpg" or "images/your-image.jpg" or "your-pdf.pdf" etc.
const remoteImagePath = storageBucket.file( fileName ).getSignedUrl({
    action: "read",
    expires: '03-17-2025' // this is an arbitrary date
})
.then( data => data[0] )
person Adriaan Scholvinck    schedule 25.10.2019

Если вам просто нужны временные ссылки на все изображения в папке в Cloud Storage Bucket, следующий фрагмент кода сделает это. В этом примере я запрашиваю все изображения в папке images/userId.

exports.getImagesInFolder = functions.https.onRequest(async (req, res) => {
    const storageRef = admin.storage().bucket('gs://{YOUR_BUCKET_NAME_HERE}');
    const query = {
        directory: `images/${req.body.userId}` // query for images under images/userId
    };
    
    const [files] = await storageRef.getFiles(query)
    const urls = await Promise.all(files.map(file => file.getSignedUrl({
        action: "read",
        expires: '04-05-2042' // this is an arbitrary date
    })))

    return res.send({ urls })
})

Документация по API:

PS: помните, что это может позволить любому передать userId и запросить все изображения для этого конкретного пользователя.

person tkleiven    schedule 14.05.2021