javascript - node - storage child is not a function
TypeError: firebase.storage no es una funciĆ³n (7)
Algunos detalles a tener en cuenta:
- 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. - A diferencia de Firebase, la nube de Google cuesta dinero, incluso para proyectos pequeños.
- 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 eljson
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
- 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.
- Debería ver que ya debe existir una cubeta de su proyecto Firebase.
- Vuelva a hacer clic en el menú (icono de 3 barras), luego> IAM & Admin > Configuración
- 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:
Agregar almacenamiento a mi proyecto en Firebase (NO en Google Cloud)
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
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=1Inicializa la aplicación:
admin.initializeApp({ credential: admin.credential.cert("/path/to/generated/json/here.json"), storageBucket: "folder-URL-from-Storage-page-excluding-gs://" });
Acceda al objeto de contenedor con (desde los documentos de Admin SDK):
const bucket = admin.storage().bucket();
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.