3
votes

I keep getting a "XMLHttpRequest is not defined" when attempting to get the downloadURL of images I just uploaded to storage. Any thoughts on what is going on here? I can retrieve the metadata, but the image url is not listed in the scheme :/

Node:

import firebase, { storage } from './firebase';
const serviceAccount = require('./serviceAccountKey.json');
const admin = require('firebase-admin');
const app = express()
const dbUrl = "https://authentication.firebaseio.com"

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: dbUrl,
  storageBucket: 'authentication.appspot.com'
});

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

......
bucket.upload(imageUrl).then(result => {
        const file = result[0];
        return file.getMetadata();
      }).then(results => {
          const ref = storage.ref('users/' + userRecord.uid + '/image').downloadURL();
          console.log(ref)
          //const metadata = results[0];
          //console.log('metadata=', metadata.mediaLink);
          //firebase.database().ref('users/' + userRecord.uid + '/image').set(metadata.mediaLink);
      }).catch(error => {
          console.error(error);
      });
    })
    .catch(function(error) {
      console.log("Error creating new user:", error);
    });

Storage: enter image description here

3
How are you running this code? - Doug Stevenson
Hi Doug, I am using Node. Just updated the question - user992731
To get the download URL for a file in Node.js, see stackoverflow.com/questions/42956250/… - Frank van Puffelen

3 Answers

3
votes

The Firebase client SDKs for JavaScript are mostly not supported for use on NodeJS. This explains your error - XMLHttpRequest is natively available on browsers but not in node. If you want to run server-side code that accesses Firebase and Google Cloud resources, you should be using the server SDKs.

Firebase provides server SDKs via the Firebase Admin SDK, which fully works on node. For Cloud Storage access, the Admin SDK repackages the existing Cloud Storage SDK provided by Google Cloud.

Note that there is no concept of a "download URL" provided by the Google Cloud SDK for Cloud Storage. It has something called a "signed URL" to use similarly.

4
votes

I figured out that using a global XMLHttpRequest was sufficient so, I did

npm install xhr2

and added

global.XMLHttpRequest = require("xhr2");

to the top of my file. It worked for me.

1
votes

npm install xhr2 worked for me. Please note, in general, this is not good practice. If you are working with Firebase Cloud Storage, at the nodejs level (server), you should be using the admin sdk (for servers), not the firebase client sdk. This means that you will be using google cloud functions.