web-dev-qa-db-ja.com

TypeError:firebase.storageは関数ではありません

this の例に従って、エラーが発生し続けます:

 TypeError: firebase.storage is not a function

私のコードのこの行から:

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

(そして、 firebaseのnpmサイト からリンクされている storage guide からストレージを初期化しようとすると、同じエラーが発生します。)

Node.jsプロジェクトには、次のライブラリが含まれています。

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

ここまでは、firebaseデータベースの読み取りと書き込みに成功し、var db = admin.database()を使用してデータベースへの参照を作成してから、var ref = db.ref("/")...を使用して、Firebaseとfirebase-databaseを正しく構成しました。しかし、私はstorageにこだわっており、admin.storage().ref()firebase.storage().ref()の両方、およびfirebase.storage().ref("/")を同じエラーメッセージで試しました。

私も試しました:

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

そして

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

ref()のvoid引数()"/"...を使用しますが、同じメッセージがありますが、まだ役に立ちません。

私は使用しています:

  • 「firebase」:「^ 3.6.4」
  • 「firebase-admin」:「^ 4.0.4」
  • Node.js:v6.9.1

ストレージへの参照を正常に作成するにはどうすればよいですか?

36
NonCreature0714

非推奨、以下を参照:

この回答 によると、Node.jsでは、firebaseストレージの代わりに、google-cloudパッケージストレージを使用する必要があり、 この回答 で確認する必要があるようです。コード例:

npm i --save google-cloud

次に:

const gcloud = require('google-cloud')

const storage = gcloud.storage({
    projectId: '<projectID>',
    keyFilename: 'service-account-credentials.json',
});

const bucket = storage.bucket('<projectID>.appspot.com')

2018年現在、これは正しい答えです:

または、パッケージのストレージ部分のみを使用する:

npm install --save @google-cloud/storage

その後:

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

ドキュメント も確認してください。

24
Selfish

私は同じ問題に直面しました。私の場合、Firebaseコアのほかにストレージモジュールを含める必要がありました。

import firebase from 'firebase';
import 'firebase/storage';  // <----

firebase.initializeApp({
  ...
});
const storageRef = firebase.storage().ref();

(npm firebase v5.0.4)

17
Ginpei

Firebaseでストレージを使用する場合、バケットを無料利用枠に追加できないことは間違いありません。ただし、デフォルトでバケット(1つだけ)を取得します。私の(最終的に)成功した​​アプローチは次のとおりでした:

  1. Firebaseのプロジェクトにストレージを追加します(Google Cloudではありません)

  2. Admin SDKを追加し、Googleドキュメントに従って必要なサービスアカウントを設定します。 https://firebase.google.com/docs/admin/setup?authuser=1

  3. ストレージでAdmin SDKを使用する手順に従って、@google-cloud/storageパッケージを追加します。 https://firebase.google.com/docs/storage/admin/start?authuser=1

  4. アプリを初期化します。

    admin.initializeApp({
      credential: admin.credential.cert("/path/to/generated/json/here.json"),
      storageBucket: "folder-URL-from-Storage-page-excluding-gs://"
    });
    
  5. (Admin SDKドキュメントから)でバケットオブジェクトにアクセスします。

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

  6. ストレージライブラリを使用してバケットを操作します。例:

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

注:バケットを持っていなかったために動作していないと確信して数時間を費やしましたが、初期化時にストレージバケットへのパスにgs://が含まれていたことが判明しました。

5

アプリをローカルでテストすると同じ問題が発生しますが、すべてがプロジェクトのデプロイ時に機能しますです。

この方法では、実際に次の回避策を使用します。

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

少し興味がありますが、私の場合はうまくいきます。

1
Alexandre

新しいバージョンのライブラリで修正されたようです。関連するパッケージでnpm updateを実行するだけで機能します。

0
Ivan Rubinson

次のようにしようとすると変更されますか?

// Initialize the default app:
const app = firebase.initializeApp(appConfig)

// Initialize storage from the *app* object:
const storage = app.storage()

ドキュメント から、これは代替方法のようです。これはストレージをアプリにリンクし、コードをより読みやすく、より機能的にするので、これが好きです

0
Selfish