Node.js Функция Firebase, отправляющая изображение Base64 во внешний API - PullRequest
0 голосов
/ 27 августа 2018

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

В настоящее время я беру изображения, загруженные в корзину в моемХранение Firebase, преобразование их в строки base64 и вставка их в мой словарь для запроса.

Моя текущая проблема заключается в том, что словарь сокращается.Я посмотрел журналы консоли на консоли Firebase и похоже, что она заканчивается после переменной base64.

Я не уверен, является ли это ошибкой с синтаксисом, или с тем, как я использую base64, или с функциями Firebase.Если кто-нибудь знает, что может происходить, пожалуйста, дайте мне знать.

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

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

    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")

    // Create Firebase app (for Realtime Database access)

    var config = {
        apiKey: "[apikey]",
        authDomain: "[PROJECT_ID].firebaseapp.com",
        databaseURL: "https://[PROJECT_ID].firebaseio.com",
        storageBucket: "[PROJECT_ID].appspot.com",
    };

    if(!firebase.apps.length) {
        firebase.initializeApp(config);
    }

    // Trace back to Update stored in Realtime Database

    const database = firebase.database().ref()
    const pendingRef = database.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
    }).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': '[id]',
                'app_key': '[key]'
            },
            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']['transaction']['subject_id']
                console.log("Transaction " + JSON.stringify(apiResult))

            })
            .catch(function(err) {
                console.log('API call failed')
            })
        });

    })

    // 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');
}

Вывод изображения: Output

...