6

का उपयोग करके छवि को हटाने में समस्याएं मैं फ़ायरबेस के लिए क्लाउड फ़ंक्शंस में एक स्क्रिप्ट बनाने की कोशिश कर रहा हूं जो एक डीबी ईवेंट पर प्रतिक्रिया करेगा और उस छवि को हटा देगा जिसमें उसका पथ है पैराम्स ("फुलपाथ")।फ़ायरबेस के लिए क्लाउड फ़ंक्शंस और @ google-cloud/storage

'use strict'; 

const functions = require('firebase-functions'); 
const request = require('request-promise'); 
const admin = require('firebase-admin'); 
const gcs = require('@google-cloud/storage')({ 
    projectId: 'XXXXXXX', 
    credentials: { 
     // removed actual credentials from here 
    }}); 

admin.initializeApp(functions.config().firebase); 

// Deletes the user data in the Realtime Datastore when the accounts are deleted. 
exports.removeImageOnNodeRemoval = functions.database 
    .ref("images/{imageId}") 
    .onWrite(function (event) { 

     // exit if we are creating a new record (when no previous data exists) 
     if (!event.data.previous.exists()) { 
      console.log("a new image added"); 
      return; 
     } 

     // exit if we are just trying to update the image 
     if (event.data.exists()) { 
      console.log("image is been modified"); 
      return; 
     } 

     let previousData = event.data.previous.val(); 
     if(!previousData || !previousData.fullPath){ 
      console.log("no data in the previous"); 
      return; 
     } 

     let bucketName = 'XXXXXXX'; 
     console.log("default bucketName", gcs.bucket(bucketName)); 
     let file = gcs.bucket(bucketName).file(previousData.fullPath); 
     console.log('the file /'+previousData.fullPath, file); 

     file.exists().then(function(data) { 
      let exists = data[0]; 
      console.info("file exists", exists); 
     }); 

     file.delete().then(function() { 
      // File deleted successfully 
      console.log("image removed from project", previousData.fullPath); 

     }).catch(function(error) { 
      // Uh-oh, an error occurred! 
      console.error("failed removing image from project", error, previousData); 
     }); 

    }); 

त्रुटि मैं हो रही है::

इस

कोड मैं का उपयोग कर रहा है

failed removing image from project { ApiError: Not Found 
    at Object.parseHttpRespBody (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:192:30) 
    at Object.handleResp (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:132:18) 
    at /user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:465:12 
    at Request.onResponse [as _callback] (/user_code/node_modules/@google-cloud/storage/node_modules/retry-request/index.js:120:7) 
    at Request.self.callback (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:188:22) 
    at emitTwo (events.js:106:13) 
    at Request.emit (events.js:191:7) 
    at Request.<anonymous> (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1171:10) 
    at emitOne (events.js:96:13) 
    at Request.emit (events.js:188:7) 
    at IncomingMessage.<anonymous> (/user_code/node_modules/@google-cloud/storage/node_modules/request/request.js:1091:12) 
    at IncomingMessage.g (events.js:291:16) 
    at emitNone (events.js:91:20) 
    at IncomingMessage.emit (events.js:185:7) 
    at endReadableNT (_stream_readable.js:974:12) 
    at _combinedTickCallback (internal/process/next_tick.js:74:11) 
    at process._tickDomainCallback (internal/process/next_tick.js:122:9) 
    code: 404, 
    errors: [ { domain: 'global', reason: 'notFound', message: 'Not Found' } ], 
    response: undefined, 
    message: 'Not Found' } { contentType: 'image/png', 
    fullPath: 'images/1491162408464hznsjdt6oaqtqmukrzfr.png', 
    name: '1491162408464hznsjdt6oaqtqmukrzfr.png', 
    size: '44.0 KB', 
    timeCreated: '2017-04-02T19:46:48.855Z', 
    updated: '2017-04-02T19:46:48.855Z' } 

मैं के साथ और साख google-क्लाउड पर/भंडारण (वे बिना सोचे की कोशिश की है फायरबेस में काम करते समय ऑटो भर सकता है। कार्य - क्या मुझे उनकी ज़रूरत है?)। मैंने फ़ाइल के पथ में एक स्लैश जोड़ने का प्रयास किया है। मैंने मान्य किया है कि फ़ाइल वास्तव में बाल्टी में मौजूद है (यहां तक ​​कि file.exists() भी झूठी रिटर्न)। मेरे द्वारा प्रदान किए गए प्रमाण-पत्र एक Iam के लिए हैं जिन्हें मैंने स्टोरेज सेवा के लिए व्यवस्थापकीय विशेषाधिकारों के साथ बनाया है।

मैंने निःशुल्क योजना पर बिलिंग खाता भी सक्षम कर दिया है।

कोई विचार?

उत्तर

5

ठीक है, इसलिए मुझे यह हल हो गया। यहां मेरे निष्कर्ष हैं:

  • आपको अपने बाल्टी नाम ".appspot.com" में जोड़ना होगा। यह दस्तावेज़ों में कहीं भी नहीं लिखा गया है और फायरबेस में अपना बाल्टी नाम प्राप्त करना किसी ऐसे व्यक्ति के लिए कठिन है जो Google क्लाउड में परिचित नहीं है। मुझे आशा है कि वे जानकारी की इस छोटी शांति को अपने दस्तावेज़ों में जोड़ देंगे या यह स्पष्ट करेंगे कि फायरबेस में आपकी बाल्टी का नाम क्या है।
  • पर्यावरण परिवर्तनीय process.env.GCLOUD_PROJECT का उपयोग करें, यह आपके प्रोजेक्ट आईडी होना चाहिए जो आपके बाल्टी आईडी में फ़ायरबेस में समान हो। फिर, इसे .appspot.com प्रत्यय जोड़ने के लिए याद रखें।
  • जीसीएस के प्रमाण-पत्रों के संबंध में, आपको उन्हें फायरबेस के लिए क्लाउड फ़ंक्शंस का उपयोग करते समय प्रदान करने की आवश्यकता नहीं है। आप पहले ही प्रमाणित प्रतीत होते हैं।
3

gs://

उदाहरण नहीं शामिल करता है सुनिश्चित करें कि आपके बाल्टी नाम बनाओ। gs://my-project-id.appspot.com के बजाय का उपयोग my-project-id.appspot.com

let bucket = gcs.bucket('my-project-id.appspot.com')

यह आप के लिए हो सकता है (के रूप में यह मेरे के लिए क्या किया) आप, से अपने बाल्टी नाम कॉपी करता है, तो उदाहरण के लिए, एंड्रॉयड कोड है, जहां आप कनेक्ट करने के लिए पूर्ण URL का उपयोग कर सकते के लिए भंडारण के साथ, यानी। storage.getReferenceFromUrl('gs://my-proj...

इसके अलावा, यह (लेकिन यह अगर आप इसे शामिल है को तोड़ने नहीं होना चाहिए) लगता है projectId चर आप आरंभ करने के लिए gcsappspot.com प्रत्यय की जरूरत नहीं है का उपयोग करें। अर्थात। projectId:'my-project-id' पर्याप्त होना चाहिए।

अंत में, GCS node package docs बताता है कि आपको स्थानीय रूप से चीजों का परीक्षण करने के लिए keyFilename के रूप में पास करने के लिए अलग JSON उत्पन्न करने की आवश्यकता है। अच्छी खबर यह है कि आप फायरबेस एडमिन एसडीके कुंजी का उपयोग कर सकते हैं, जैसा कि Get Started Server/Admin docs में वर्णित है।

संबंधित मुद्दे