not node name data child and javascript node.js firebase firebase-storage

javascript - node - storage child is not a function



TypeError: firebase.storage no es una funciĆ³n (7)

Algunos detalles a tener en cuenta:

  1. Firebase Storage ya no se usa con Node.js, toda la documentación allí es inútil para Node.js. En su lugar utiliza google-cloud . Las referencias y guías para Firebase y Google Cloud no reflejan esto a partir de hoy.
  2. A diferencia de Firebase, la nube de Google cuesta dinero, incluso para proyectos pequeños.
  3. En mi caso, estoy usando el firebase-admin para no tener que meterme con la autenticación de usuario en este momento.

Propósito

Para crear un solo proyecto Node.js que use Firebase y Google Cloud. ¿Por qué? Firebase tiene una base de datos útil, entre otras características, y Google Cloud permite el almacenamiento y la recuperación de archivos en la nube.

Direcciones

Paso 1: Creación de proyectos

Crear proyectos Firebase y Google Cloud (Storage) .

Paso 2: Instalar paquetes

Usando npm , instale firebase-admin y Firebase en el proyecto Node.js

Nota 1: usé el SDK de administración, así que después de crear el proyecto Firebase, tendrás que ir a:

  • Configuración (el engranaje)> Configuración del proyecto > Cuentas de servicio > Firebase Admin SDK
  • Luego: Seleccione Node.js > [Copiar / pegar el código generado en su proyecto]> [haga clic en "Generar nueva clave privada"]> [descargar el json a la ubicación preferida]> [reemplazar "path/to...AccountKey.json" con la ruta a la clave que acabas de generar]

Nota 2: la clave generada se puede reutilizar en las credenciales de firebase o google-cloud.

Paso 3: Configuración de Firebase

Una vez que se haya creado su proyecto, importe el firebase-admin sdk:

El código debería tener este aspecto, pero con su información:

var admin = require("firebase-admin"); admin.initializeApp({ credential: admin.credential.cert("/path/to/generated/json/here.json"), databaseURL: "database-url-from-firebase" });

Para encontrar la databaseURL, vaya a ''Almacenamiento'' en Firebase y anote la URL que comienza con gs: y copie / pegue el campo de valor de databaseURL.

A continuación, obtenga una referencia a la base de datos que puede utilizar:

var db = admin.database(); var ref = db.ref("/"); console.log(''DB ref: '' + ref); //just to debug, if undefined, there''s a problem.

Para obtener más información sobre la lectura / escritura en la base de datos, siga la documentación propia de Firebase .

Paso 4: Configuración de facturación de Google-Cloud

Después de crear un proyecto en Google Cloud, agregue información de facturación; Los cubos no se pueden utilizar sin información de facturación.

Paso 5: Configuración de almacenamiento de Google-Cloud

  1. Desplácese por el menú (las 3 barras horizontales), haga clic en "Almacenamiento" y luego en "Habilitar facturación". Sí, agregó información de facturación, ahora necesita habilitarla para los depósitos de ese proyecto.
  2. Debería ver que ya debe existir una cubeta de su proyecto Firebase.
  3. Vuelva a hacer clic en el menú (icono de 3 barras), luego> IAM & Admin > Configuración
  4. En la configuración, verá "ID de proyecto", que debería verse como "projectName-00000" o "projectName-Some #", copie esa ID de proyecto

Paso 6: Google Cloud en Node.js

En tu index.js :

var gcloud = require(''google-cloud''); var gcs = gcloud.storage({ projectId: ''paste-that-project-id-here'', keyFilename: ''paste-that-path-to-the-previously-downloaded-json-from-firebase-here'' });

Ahora puede enviar un archivo a su almacenamiento mediante:

var bucket = gcs.bucket(''bucket_name''); var remoteFile = bucket.file(''somefile-inThisCaseASong.mp3''); var localFilename = ''/Users/you/Music/somefile-inThisCaseASong.mp3''; bucket.upload(localFilename, function(err, file) { if (!err) { console.log(''somefile-inThisCaseASong.mp3 is now in your bucket.''); } else { console.log(''Error uploading file: '' + err); } });

Paso 7: Verificar

Si el archivo es visible en Firebase Storage y Google Cloud Storage, ¡listo!

Siguiendo this ejemplo, sigo recibiendo el error:

TypeError: firebase.storage is not a function

Desde esta línea en mi código:

var storageRef = firebase.storage().ref();

(Y cuando simplemente trato de inicializar el almacenamiento desde la guía de almacenamiento , vinculado desde el sitio npm de firebase , obtengo el mismo error).

En mi proyecto Node.js, estoy incluyendo las siguientes bibliotecas:

  • const firebase = require(''firebase'');
  • var admin = require(''firebase-admin'');
  • const fs = require(''fs'');

Hasta este punto, he podido leer y escribir con éxito en la base de datos de base de fuego, creando una referencia a la base de datos con var db = admin.database() , luego var ref = db.ref("/") . .. Así que sé que he configurado Firebase y firebase-database correctamente. Pero estoy atascado en el storage , y he probado admin.storage().ref() y firebase.storage().ref() , y firebase.storage().ref("/") con el mismo mensaje de error .

También he intentado:

var storage = firbase.storage(); var storageRef = storage.ref();

y

const app = firebase.initializeApp(config); var storage = app.storage();

y con el argumento void () ref() y con "/" ... pero tienen el mismo mensaje, pero sin resultado.

Estoy usando:

  • "base de fuego": "^ 3.6.4"
  • "firebase-admin": "^ 4.0.4"
  • Node.js: v6.9.1

¿Qué debo hacer para crear con éxito una referencia al almacenamiento?


¿Cambia si intentas hacerlo como el siguiente?

// Initialize the default app: const app = firebase.initializeApp(appConfig) // Initialize storage from the *app* object: const storage = app.storage()

De Firebase , parece que este es un método alternativo. Prefiero este, ya que vincula el almacenamiento con la aplicación, lo que hace que el código sea más legible y más funcional.


Cuando usa Storage with Firebase, tiene razón en que no puede agregar depósitos en el nivel gratuito. Sin embargo, sí obtienes un cubo (solo uno) por defecto. Mi enfoque (eventualmente) exitoso fue:

  1. Agregar almacenamiento a mi proyecto en Firebase (NO en Google Cloud)

  2. Agregue el SDK del administrador y configure la cuenta de servicio necesaria según los documentos de Google: https://firebase.google.com/docs/admin/setup?authuser=1

  3. Agregue el paquete @google-cloud/storage según las instrucciones sobre el uso del SDK de administración con almacenamiento: https://firebase.google.com/docs/storage/admin/start?authuser=1

  4. Inicializa la aplicación:

    admin.initializeApp({ credential: admin.credential.cert("/path/to/generated/json/here.json"), storageBucket: "folder-URL-from-Storage-page-excluding-gs://" });

  5. Acceda al objeto de contenedor con (desde los documentos de Admin SDK):

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

  6. Operar en el cubo con la biblioteca de almacenamiento. Ejemplo:

    bucket.upload(''/path/file.ext'', function(err, file, apiResponse) { //Do Stuff });

NOTA: Pasé un par de horas convencido de que no estaba funcionando porque no tenía un cubo, pero resultó que mi error fue incluir gs:// en la ruta de acceso a mi cubo de almacenamiento al inicializar.


Encuentro el mismo problema cuando pruebo mi aplicación localmente, pero todo funciona cuando se implementa el proyecto .

De esta manera, en realidad uso la siguiente solución:

if (!firebase.storage) { // prevent crash when working locally return; } let ref = firebase.storage().ref() // perform production stuff ...

Es un poco curioso, pero funciona en mi caso.


Me enfrenté al mismo problema. En mi caso, necesitaba incluir un módulo de almacenamiento además del núcleo Firebase.

import firebase from ''firebase''; import ''firebase/storage''; // <---- firebase.initializeApp({ ... }); const storageRef = firebase.storage().ref();

(npm base de fuego v5.0.4)


Parece que lo han arreglado en una nueva versión de la biblioteca. Simplemente ejecute la npm update en los paquetes relevantes y debería funcionar.


DEPRECATED, ver abajo:

De acuerdo con esta respuesta , en lugar del almacenamiento firebase, en Node.js, se debe usar el almacenamiento de paquetes de google-cloud , y parece que esta respuesta debería confirmarlo. Ejemplo de código:

npm i --save google-cloud

Entonces:

const gcloud = require(''google-cloud'') const storage = gcloud.storage({ projectId: ''<projectID>'', keyFilename: ''service-account-credentials.json'', }); const bucket = storage.bucket(''<projectID>.appspot.com'')

A partir de 2018, esta es la respuesta correcta:

O usando solo la parte de almacenamiento del paquete:

npm install --save @google-cloud/storage

Y entonces:

var storage = require(''@google-cloud/storage'')

También revise los documentos para más.