質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

1回答

1073閲覧

[node.js]Firebase storageにアップロードできない(firebase is not defined)

yoshiky

総合スコア105

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

0クリップ

投稿2018/11/04 03:59

お世話になってます。
ネット上から画像を取得し、Firebase Storageに保存するアプリをFirebase functionsで動かしたいのですが、Storageへのアップロードができずに困っております。

やりたいこと
  • 画像提供サービスからAPI経由で画像情報を取得
  • 取得した画像をFirebase Storageに保存
できないこと
  • Firebase Storageへのアップロード
書いたソースコード
$ node -v v8.7.0 $ firebase -V 4.2.1

javascript

1//const firebase = require('firebase'); // <=コメントアウトしても結果は変わらず 2const functions = require('firebase-functions'); 3const admin = require('firebase-admin'); 4const rp = require('request-promise'); 5 6const path = require('path'); 7const os = require('os'); 8const fs = require('fs'); 9 10const config = { 11 apiKey: "xxx", 12 authDomain: "xxx.firebaseapp.com", 13 databaseURL: "https://xxx.firebaseio.com", 14 projectId: "xxx", 15 storageBucket: "xxx.appspot.com", 16 messagingSenderId: "00000000" 17 }; 18firebase.initializeApp(config); 19const storageRef = firebase.storage().ref(); 20const fileRef = storageRef.child('test.jpg'); 21 22const options = { 23 uri: 'https://xxx', 24}; 25 26const tmpFile = path.join(os.tmpdir(), 'test.jpg'); 27 28exports.api = functions.https.onRequest((request, response) => { 29 async function main(){ 30 // 画像情報を取得 31 const photoInfo = await getPhotoInfo(); 32 const photo = photoInfo.info.photo[0]; 33 const fileName = photo['image_url'].split('/').pop(); 34 const fileUrl = photo['image_url']; 35 36 // 画像をダウンロード 37 await downloadPhoto(fileUrl, fileName); 38 // ダウンロードできたか確認。console出力されるのでダウンロードはできているはず 39 fs.exists(tmpFile, exists => { 40 if(exists){ 41 console.log('exist downloaded file.'); 42 } 43 }) 44 45 // 画像をアップロード 46 fileRef.put(tmpFile).then(function(snapshot) { 47 console.log('Uploaded file!'); 48 }); 49 } 50 51 main(); 52 53 async function getPhotoInfo() { 54 const result = await rp(options); 55 return JSON.parse(result); 56 } 57 58 async function downloadPhoto(fileUrl, fileName) { 59 await rp(fileUrl) 60 .then(response => { 61 const writeStream = fs.createWriteStream(tmpFile); 62 writeStream.write(response, (err) => { 63 if(err) { 64 console.log(err); 65 } 66 }); 67 }); 68 } 69 70 response.send("Send successfully"); 71}); 72
実行結果

firebase-toolsを使い$ firebase serve --only functionsで実行すると
ReferenceError: firebase is not defined
となり起動しない

聞きたいこと
  • アップロードの仕方

※1投稿1質問が基本かもしれませんが、、可能であれば下記も教えて頂けるとありがたいです。

  • Admin SDKについて

公式サイトにはFirebase Storageの扱いは2方法掲載されています。
ウェブでファイルをアップロードする
Admin Cloud Storage API の概要
Adminの方は「特権環境から Google Cloud Storage バケットに直接アクセスできます。」と説明がありますが、特権環境ということは管理者用のアプリのみで、ユーザに後悔するアプリでは使わない方がいい、くらいの意味なのでしょうか。

  • Firebase StorageとGoogle Cloud Storageの違い

もともとFirebaseは独立したサービスだったが、Googleに買収されて以降はGCPからFirebaseが操作できたり、両者の親和性が高まっている、くらいの理解なのですが、よく「Firebase storage upload」で検索すると「Google Cloud Storage」へアップロードしている記事を見かけるので、もしかして同じ?Admin SDKの方にもFirebaseのサイトなのに「Google Cloud Storage バケットに直接アクセスできます。」という説明があります。。

根本的な部分の理解が乏しいのでお恥ずかしいですが、アドバイスを頂けると幸いです。
よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のようにしてください。

firebase.initializeApp(config); ↓ admin.initializeApp();

何かの記事を参考にされたと思うのですが、ちゃんと公式ドキュメントを確認しましょう。
https://firebase.google.com/docs/functions/get-started?hl=ja#header

投稿2018/11/04 04:53

xenbeat

総合スコア4258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshiky

2018/11/04 05:14

ご回答ありがとうございます。下記のようにしたらアップロードされました! オプションの指定が甘いのか、真っ黒な小さい画像となってしまいましたが。 const admin = require('firebase-admin'); admin.initializeApp(); const bucket = admin.storage().bucket(); bucket.upload(tmpFile).then(res => { console.log(res); }) ちなみにfirebase.storage().ref();も公式に乗っている書き方ですが、何故ダメなのかご存知でしょうか。 https://firebase.google.com/docs/storage/web/upload-files?hl=ja
xenbeat

2018/11/04 06:38

firebase.storage()」もでしたね。見逃してました。。。 > firebase.storage().ref();も公式に乗っている書き方ですが、何故ダメなのかご存知でしょうか。 「firebase = require('firebase')」が使えないのは、単純にFirebase SDKを追加していないからだと思いますよ。 https://firebase.google.com/docs/web/setup?hl=ja#prerequisites 質問内容的に確認しませんでしたが、firebase-toolsを使ってfunctionsの初期化をされたのではないでしょうか。 上記ドキュメントの冒頭にも記載されている通り、特権環境(サーバーやCloud Functions)から利用する場合はAdmin SDKの利用が推奨されています。 なので、firebase-toolsを使って初期化された場合は、Firebase SDKではなくAdminSDKが自動的に含まれることになります。
yoshiky

2018/11/04 10:44

ありがとうございます! > Firebase SDKを追加していないから > firebase-toolsを使ってfunctionsの初期化をされたのではないでしょうか。 なるほど、確かにまだfirebase-toolsでしか動かしていないです。 改めて下記コマンドでインストールしてみたところ、firebase is not defined は出なくなりました。 npm install firebase @firebase/storage firebase-admin --save しかし代わりに firebase.storage().ref(); の部分で firebase.storage is not a function が出るようになりました。firebase/storageはインストールしているのですが。。 Admin SDKを使えばエラーは出なくなりますが、、 > 特権環境(サーバーやCloud Functions)から利用する場合はAdmin SDKの利用が推奨されています。 失礼しました。見落としていました。サーバサイド(=アプリのユーザが触れない場所)であれば特権環境としてAdmin SDKを、公式ドキュメントにあるような公開HTMLの中にscirptとして含めるのであればfirebase.storage().ref()などを使う、というような使いわけ?と理解しました。
yoshiky

2018/11/04 10:49

失礼しました。 require("firebase/storage"); を忘れていました。 (別の箇所でエラーにはなりましたが、とりあえず firebase serve --only functions でエラーなく起動してくれました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問