Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google Storage is not a constructor error

I am building an App and my objective is every time someone upload an image to firebase storage, the cloud function resize that image.

...
import * as Storage from '@google-cloud/storage'
const gcs = new Storage()
...

exports.resizeImage = functions.storage.object().onFinalize( async object => {
   const bucket = gcs.bucket(object.bucket);
   const filePath = object.name;
   const fileName = filePath.split('/').pop();
   const bucketDir = dirname(filePath);
....

And when I tried to deploy this funtion I get this error:

Error: Error occurred while parsing your function triggers.

TypeError: Storage is not a constructor

I tried with "new Storage()" or just "Storage" and nothing works.

I'm newbie around here so if there's anything I forgot for you to debug this just let me know.

Thanks!


google-cloud/storage: 2.0.0

Node js: v8.11.4

like image 559
Domingos Nunes Avatar asked Sep 06 '18 14:09

Domingos Nunes


2 Answers

On node 14, using commonJS with babel (although I don't think Babel was interfering here), this is how I eventually got it working on an older project bumping GCS from 1.x to 5.x:

const Storage = require('@google-cloud/storage');
const gcs = new Storage({project_id});

didn't see this captured anywhere on the web

like image 177
Jakay Avatar answered Nov 09 '22 04:11

Jakay


The API documentation for Cloud Storage suggests that you should use require to load the module:

const Storage = require('@google-cloud/storage');

This applied to versions of Cloud Storage prior to version 2.x.

In 2.x, there was a breaking API change. You need to do this now:

const { Storage } = require('@google-cloud/storage');

If you would like TypeScript bindings, consider using Cloud Storage via the Firebase Admin SDK. The Admin SDK simply wraps the Cloud Storage module, and also exports type bindings to go along with it. It's easy to use:

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

admin.storage() gives you a reference to the Storage object that you're trying to work with.

like image 30
Doug Stevenson Avatar answered Nov 09 '22 03:11

Doug Stevenson