typescript - firebase-funktion hämta nedladdningslänk efter att ha sparat bilden i Firebase Cloud Storage
Jag har problem med att få nedladdnings-URL i en Firebase-funktion efter att ha sparat en bild till Cloud Storage. Nedan är min Firebase HTTP-funktion i TypeScript för att spara en base64-sträng till JPEG i Firebase Cloud Storage. När jag loggar resultatet är det alltid tomt. Jag följer den här länken för att få nedladdnings-URL: "Get Public URL from file uploaded with firebase-admin". Men det ger mig följande fel: "SigningError: Identity and Access Management (IAM) API har inte använts i projekt 81673989436 tidigare eller är inaktiverad." Och jag kunde inte hitta ett enkelt exempel att följa. Min plan är att uppdatera min Firestore-tabell när bilden har laddats upp till Cloud Storage.
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");
})
Felet är som följer i Firebase-konsolen. Även med fel kan jag spara bilden i lagringen.
SigningError: Behörigheten iam.serviceAccounts.signBlob krävs för att utföra denna operation på servicekontot projects/vmsystem-4aa54/serviceAccounts/[email . vid /user_code/node_modules/@google-cloud/storage/src/file.js:1715:16 vid Request._callback (/user_code/node_modules/@google-cloud/storage/node_modules/google-auto-auth/index.js:356:9) vid Request.self.callback (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:186:22) vid emitTwo (events.js:106:13) vid Request.emit (events.js:191:7) vid Request. (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1163:10) vid emitOne (events.js:96:13) vid Request.emit (events.js:188:7) vid IncomingMessage. (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1085:12) vid IncomingMessage.g (events.js:292:16)
Hur kan jag få nedladdnings-URL?
Jag blir förvirrad. Nu sitter jag fast med att uppdatera funktionen efter ändringar. Nedan är min initialisering för admin.
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;
Svar #1
Du visar inte all kod här (till exempel hur du initialiserade Firebase Admin SDK för att skapa admin). Så jag kommer att anta att du använde projektets standarduppgifter för att initialisera det på detta sätt:
import * as admin from 'firebase-admin'
admin.initializeApp()
Detta är inte tillräckligt för att kunna använda getSignedUrl när man använder admin SDK för att använda Cloud Storage API:er. Om du vill använda getSignedUrl måste du tillhandahålla autentiseringsuppgifterna för ett dedikerat tjänstekonto som du skapar i konsolen.
Förutsatt att du lägger dessa uppgifter i en fil som heter yourServiceAccount.json i din funktionsmapp, bör du initialisera admin-SDK:en med dessa uppgifter på följande sätt:
import * as serviceAccount from 'yourServiceAccount.json';
const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG)
adminConfig.credential = admin.credential.cert(<any>serviceAccount)
admin.initializeApp(adminConfig);
Observera att detta bara tar standardprojektkonfigurationen från FIREBASE_CONFIG och lägger till tjänstekontot till den.
För att kunna importera en JSON-fil behöver du också ha en fil (kallad typings.d.ts):
declare module "*.json" {
const value: any;
export default value;
}
Svar #2
Tack @Doug Stevenson. Jag tror att jag har hittat ett svar.
Jag löser distributionsfel genom att återskapa ett nytt projekt.
Jag ändrar min initialisering till koden nedan för att lösa ohanterade avvisningar. Gå till Servicekonton under Projektinställningar i ditt Firebase-projekt och generera en ny privat nyckel under 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. });



