У меня есть небольшая хитрая проблема с 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
}