Node.js - не удалось получить ошибку URI при загрузке изображения из хранилища Firebase через функцию Firebase - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть небольшая хитрая проблема с Firebase, которую я хотел бы узнать, есть ли у кого-нибудь понимание. Я пытался найти в Google статьи, но ничего не нашел по этой теме.

Некоторый фон:

Я пишу функцию Firebase с триггером Storage, который загружает образ из Firebase Storage, затем преобразует его в base64 и отправляет его во внешний API. Затем функция обрабатывает ответ и обновляет дочерний элемент в базе данных Firebase Realtime с данными из API, используя Admin SDK.

Мой проект на платной основе.

Проблема возникла, когда я добавил некоторый код, который устанавливал значение в Базе данных реального времени, поэтому я подумал, что это проблема с разрешениями при изменении базы данных. Я переключился на Admin SDK, но проблема все еще сохранялась. Это ошибка, которую я получаю:

Ошибка: не удалось получить URI / computeMetadata / v1beta1 / экземпляр / учетные записи служб / по умолчанию / токен

Я переключился на Admin SDK и теперь могу читать / записывать в базу данных реального времени, но у меня все еще есть проблема.

Мне удалось отследить сообщение об ошибке, куда я загружаю данные, используя этот код:

const bucket = gcs.bucket(fileBucket)
const tempFilePath = path.join(os.tmpdir(), fileName)
const metadata = {
     contentType: contentType
};

return bucket.file(filePath).download({
     destination: tempFilePath
})

Я проверил права доступа к моей учетной записи службы в разделе IAM / Admin облачной консоли Google, и все настроено на редакторе проектов. Я подумал, что именно отсюда и возникла проблема, поскольку путь к файлу из сообщения об ошибке включал учетные записи служб.

Ниже, пожалуйста, найдите полный файл Node.js, с кодом, где проблема начала появляться, остальное было закомментировано.

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

// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
// exports.helloWorld = functions.https.onRequest((request, response) => {
//  response.send("Hello from Firebase!");
// });

'use strict'

const request = require('request-promise');
const gcs = require('@google-cloud/storage')();
const path = require('path');
const os = require('os');
const fs = require('fs');
const admin = require('firebase-admin');

exports.identifyUpdate = functions.storage.object().onFinalize((object) => {    

    var serviceAccount = require('./[MY PROJECT NAME]-firebase-adminsdk-vmvvk-c5efa21734.json');

    admin.initializeApp({
        credential: admin.credential.cert(serviceAccount),
        databaseURL: 'https://[MY PROJECT NAME].firebaseio.com'
    });

    var db = admin.database().ref();
    var ref = db.once('value').then(function(snap) {
        console.log('read the value');
    })

    const fileBucket = object.bucket;
    const filePath = object.name;
    const contentType = object.contentType;
    const fileName = path.basename(filePath);

    if(!filePath.substring(0,filePath.indexOf('/')) == 'updates') {
        console.log("Triggered by non-update photo")
        return null;
    }

    console.log("Update photo added")

    // Trace back to Update stored in Realtime Database

    const pendingRef = db.child('pendingUpdates')

    console.log(filePath)

    const splitPath = filePath.split(path.sep)

    const patientID = splitPath[1]
    console.log('Patient ID: ' + patientID)

    const updateID = splitPath[2]
    console.log('Update ID: ' + updateID)

    const updateRef = pendingRef.child(patientID).child(updateID)

    console.log('Found Update reference')

    const photoRef = updateRef.child('photoURLs').child(fileName)

    console.log('Photo Reference: ' + photoRef)

    // Download and convert image to base64

    const bucket = gcs.bucket(fileBucket)
    const tempFilePath = path.join(os.tmpdir(), fileName)
    const metadata = {
        contentType: contentType
    };

    // var base64;

    return bucket.file(filePath).download({
        destination: tempFilePath
    })

    // console.log('downloaded image')
    // .then(() => {
    //     console.log('Image downloaded locally to', tempFilePath)
    // }).then(() => {

    //     base64 = base64_encode(tempFilePath)
    //     console.log("Base 64: " + base64)

    // }).then(() => {
    // // Send image data to Kairos

    //     var options = {
    //         method: 'POST',
    //         uri: 'https://api.kairos.com/recognize',
    //         body: {
    //             'image': base64,
    //             'gallery_name': 'gallerytest1'
    //         },
    //         headers: {
    //             'app_id': 'XXXXXXXX',
    //             'app_key': 'XXXXXXXX'
    //         },
    //         json: true
    //     }

    //     return new Promise (() => {
    //         console.log(options)
    //         request(options)
    //         .then(function(repos) {

    //             console.log('API call succeeded');

    //             console.log('Kairos response: ' + repos);

    //             const apiResult = repos['images']
    //             console.log("Result \n" + JSON.stringify(apiResult))

    //             const faceData = face_data(apiResult)

    //             console.log("face data\n" + JSON.stringify(face_data(apiResult)))

    //             const photoURL = photoRef.once('value')
    //             console.log(photoURL)
    //             updateRef.child('faceData').set({photoURL : faceData})

    //         })
    //         .catch(function(err) {
    //             console.log(err)
    //         })
    //     });

    // })

    // // Delete app instance (to prevent concurrency leaks)

    // const deleteApp = () => app.delete().catch(() => null);
    // deleteApp.call

})

function base64_encode(file) {
    // read binary data
    var bitmap = fs.readFileSync(file);
    // convert binary data to base64 encoded string
    return new Buffer(bitmap).toString('base64');
}

function face_data(response) {

    var faceData = {};

    for(i = 0; i < response.length; i++) {

        const face = response[i]["transaction"];
        const id = face["subject_id"]
        const topLeftX = face["topLeftX"]
        const topLeftY = face["topLeftY"]
        const width = face["width"]
        const height = face["height"]

        faceData[i] = {
            'face_id': id,
            'topLeftX': topLeftX,
            'topLeftY': topLeftY,
            'width': width,
            'height': height
        }

        console.log(faceData[i])        

    }

    return faceData

}
...