Функция Firebase получает URL-адрес для загрузки после успешного сохранения изображения в облачном хранилище FireBase - PullRequest
0 голосов
/ 02 мая 2018

У меня проблемы с получением URL-адреса для загрузки в функции Firebase после сохранения изображения в облачном хранилище. Ниже моя функция firebase http в машинописном тексте для сохранения строки base64 в формате jpeg в облачном хранилище firebase. когда я регистрирую результат, он всегда пуст. Я перехожу по этой ссылке, чтобы получить ссылку для скачивания Msgstr " Получить публичный URL из файла, загруженного с помощью firebase-admin ". Но это выдает мне следующую ошибку: « SigningError: API Identity and Access Management (IAM) ранее не использовался в проекте 81673989436 или он отключен. » И не может найти простой пример для подражания. Мой план состоит в том, чтобы обновить мою таблицу Firestore, после загрузки в облачное хранилище.

export const publishImage = functions.https.onRequest((req, res) => {
// Convert the base64 string back to an image to upload into the Google 
// Cloud Storage bucket
const base64EncodedImageString=req.body.image.replace(/^data:image\/jpeg;base64,/, "");
const mimeType = 'image/jpeg';
const randomFileName = crypto.randomBytes(16).toString('hex') + '.jpeg';    
const imageBuffer = new Buffer(base64EncodedImageString, 'base64');

const bucket = admin.storage().bucket();

// Upload the image to the bucket
const file = bucket.file('images/' + randomFileName);
file.save(imageBuffer, {
    metadata: { contentType: mimeType },
}).then(result => {
    console.log(result);
    file.makePublic();
    file.getSignedUrl({
        action: 'read',
        expires: '03-09-2491'
    }).then(urls => {
        console.log(urls[0]);
    })
});
return res.status(200).send("NOT WORKING");    
})

Ошибка указана в консоли Firebase. Даже с ошибкой я могу сохранить изображение в хранилище.

SigningError: Разрешение iam.serviceAccounts.signBlob требуется для выполнения этой операции над учетной записью службы projects/vmsystem-4aa54/serviceAccounts/vmsystem-4aa54@appspot.gserviceaccount.com. по адресу /user_code/node_modules/@google-cloud/storage/src/file.js:1715:16 на Request._callback (/user_code/node_modules/@google-cloud/storage/node_modules/google-auto-auth/index.js:356:9) at Request.self.callback (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:186:22) на emitTwo (events.js: 106: 13) в Request.emit (events.js: 191: 7) по запросу. (/User_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1163:10) в emitOne (events.js: 96: 13) в Request.emit (events.js: 188: 7) на входящем сообщении. (/User_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1085:12) на IncomingMessage.g (events.js: 292: 16)

Как я могу получить URL для скачивания?

Я запутался. Теперь я застрял в обновлении функции после изменений. Ниже моя инициализация для администратора.

 import * as admin from 'firebase-admin';
 const serviceAccount = require('./../service_account.json');

 try {   
 // admin.initializeApp(functions.config().firebase); // initial
 admin.initializeApp({
     credential: admin.credential.cert(serviceAccount),
     databaseURL: "https://vmsystem-4aa54.firebaseio.com"
 });
 } catch(e) {}
 import * as simpletest from './simpletest';
 export const testsomething = simpletest.helloWorld;

first

second

third

fourth

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Спасибо @Дуг Стивенсон. Я считаю, что нашел ответ.

  1. Я решаю ошибки развертывания, воссоздавая новый проект.

  2. Я изменяю свою инициализацию на код ниже, чтобы решить необработанный отказ. Перейдите в раздел «Учетные записи служб» в разделе «Настройки проекта» в своем проекте Firebase и сгенерируйте новый закрытый ключ в Firebase Admin SDK.

    const serviceAccount = require('./path/to/serviceaccount.json');
    admin.initializeApp({
      credential: admin.credential.cert(serviceAccount),
      databaseURL: '<ur database url>', // check it under service accounts
      storageBucket: '<ur storage bucket url>' //check it in script snippet require to add to your website.
    });
    
0 голосов
/ 02 мая 2018

Вы не показываете весь код здесь (например, как вы инициализировали Firebase Admin SDK для создания admin). Поэтому я предполагаю, что вы использовали учетные данные проекта по умолчанию для его инициализации следующим образом:

import * as admin from 'firebase-admin'
admin.initializeApp()

Этого недостаточно, чтобы иметь возможность использовать getSignedUrl при обращении к административному SDK для использования API-интерфейсов облачного хранилища. Если вы хотите использовать getSignedUrl, вам нужно будет предоставить учетные данные для выделенной учетной записи службы, которую вы создаете в консоли.

Предполагая, что вы помещаете эти учетные данные в файл yourServiceAccount.json в своей папке функций, вы должны инициализировать административный SDK с такими учетными данными, такими как:

import * as serviceAccount from 'yourServiceAccount.json';
const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG)
adminConfig.credential = admin.credential.cert(<any>serviceAccount)
admin.initializeApp(adminConfig);

Обратите внимание, что это просто берет конфигурацию проекта по умолчанию из FIREBASE_CONFIG и добавляет к ним учетную запись службы.

Чтобы получить импорт файла JSON, вам также понадобится файл (называемый typings.d.ts):

declare module "*.json" {
  const value: any;
  export default value;
}
...