Хранение изображения с помощью облачных функций для Firebase

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

server.post('/', (req, res) => {
  // Some code 
}

Я использую следующее согласно документации Firebase

exports.getProcessedImage = functions.https.onRequest((req, res) => {
  // Some code
});

Код работал раньше, но теперь у меня возникают проблемы с сохранением тестового изображения в Firebase. Не знаю почему. Я проверяю вкладку «Сеть» в инструментах разработчика, и конечная точка getProcessedImage запускает код для запуска и отвечает кодом 200, поэтому не уверен, в чем проблема. Заранее благодарю за любую помощь!

Мой полный код ниже :)

const functions = require('firebase-functions');

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

const request = require('request');
const crypto = require('crypto');
const storage = require('@google-cloud/storage');

// Firebase Project ID and Service Account Key.
const gcs = storage({
  projectId: 'snapshelf-aabb55',
  keyFilename: './serviceAccountKey.json'
});

const bucket = gcs.bucket('snapshelf-aabb55.appspot.com');

function saveImage(url) {

    // Generate a random HEX string using crypto (a native node module).
    const randomFileName = crypto.randomBytes(16).toString('hex');

    // Fetch image info using a HTTP HEAD request.
    // https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD
    request.head(url, (error, info) => {
        if (error) {
            return console.error(error);
    }

    // Download image from Pixelz, then save the image to Firebase
    // using the Google Cloud API and the magic of Node Streams.
    // https://googlecloudplatform.github.io/google-cloud-node/#/docs/google-
    cloud/v0.52.0/storage/file
    // http://stackoverflow.com/questions/28355079/how-do-node-js-streams-work
    request(url)
        .pipe(
            bucket.file(`sample/images/${randomFileName}`).createWriteStream({
                metadata: {
                    contentType: info.headers['content-type']
                }
            })
        )
        .on('error', (err) => {

            // Do something if the upload fails.
            console.error(err);
        })
        .on('finish', () => {

            // Do something when everything is done.

            // Get download url for stored image
            console.log('Image successfully uploaded to Firebase Storage!')
        });
    });
}

exports.getProcessedImage = functions.https.onRequest((req, res) => {
    console.log(req.body.processedImageURL);
    /*
    if (req.body && req.body.processedImageURL) {

        // Get image from Pixelz and save it to Firebase Storage.
        saveImage(req.body.processedImageURL);

        return res.status(200).end();
    }

    res.status(400).end();
    */

    const url = 'https://www2.chemistry.msu.edu/courses/cem352/SS2017_Wulff/MichiganState.jpg'
    console.log(url);
    saveImage(url);
    console.log('Saving url');
    res.status(200).send();
});

person maxwellgover    schedule 29.04.2017    source источник
comment
Привет @maxwellgover, спасибо за вопрос! Я следовал очень похожему подходу и заставил его работать, возможно, потому, что я использую план Blaze, как указано ниже. Однако ... даже несмотря на то, что изображение сохраняется в Firebase Storage Cloud с правильным заголовком изображения и общим КБ ... каким-то образом изображение не открывается внутри панели управления консоли Firebase ... это почти, если файл поврежден или сохранены с использованием неправильного метода или чего-то подобного. Когда я перехожу к img внутри своей консоли bucket, миниатюра изображения продолжает показывать счетчик. Есть идеи, что это может быть?   -  person Fabio Nolasco    schedule 22.06.2020


Ответы (2)


Вы развертываете свою функцию в Firebase с помощью Spark Plan (бесплатно)?

Если да, то ваша проблема в следующем:

Проекты Firebase в плане Spark могут выполнять только исходящие запросы к API Google. Запросы к сторонним API завершаются ошибкой. Для получения дополнительной информации об обновлении вашего проекта.

Поскольку вы пытаетесь выполнить внешний запрос, при выполнении вашей функции ничего не происходит :(

person Jobsamuel    schedule 29.04.2017
comment
Это правило изменилось? Я не могу найти его в текущих тарифных планах. - person Fabio Marzocca; 26.12.2017
comment
@FabioMarzocca, нет, не изменилось. Просто взгляните на сообщение, которое появляется, когда вы нажимаете значок ? рядом с услугой: в нем говорится, что план Spark разрешает исходящие сетевые запросы только к службам, принадлежащим Google (...). - person Jobsamuel; 27.12.2017

Это просто прямо сейчас! Поскольку у вас есть admin. просто измени

const bucket = gcs.bucket('snapshelf-aabb55.appspot.com');

to

const bucket = admin.storage().bucket();
person 韦冬宇    schedule 17.04.2018