

### 最終目標

毎週金曜日にいいねが一番多いレシピを自作のiosアプリをダウンロードしたユーザー全員にプッシュ通知することを目標にしています。

### 困っていること

現在firebaseでiOSのプッシュ通知を実装するため、cloud functionとschedularを使っています。以下のコードをnode
functions/index.jsで実行するとタイトルのエラーが出てきてかなり英語でも日本語でも調べたのですが、解決できなくて困っています。

[code]

    var sys = require('util');
    var serviceAccount = require("../tastybox-7f666-firebase-adminsdk-tk94l-b7c20f63a6.json");
    const admin = require('firebase-admin');
    const functions = require('firebase-functions');
    const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG)["projectId"]
    adminConfig.credential = admin.credential.cert(serviceAccount);
    
    admin.initializeApp({
        credential: admin.credential.cert(serviceAccount),
        databaseURL: "https://TastyBox.firebaseio.com",
        projectId: adminConfig
    });
    
    const db = admin.firestore();
    
    exports.scheduledFunction = functions.pubsub.schedule('every 1 minutes').onRun((context) => {
        console.log('This will be run every 1 minutes!');
        let observer = db.collection("recipe").orderBy('like', 'desc').limit(1).onSnapshot(querySnapshot => {
            console.log(`Received query snapshot of size ${querySnapshot.size}`);
            // ...
            console.log(`data: ${querySnapshot.size}`)
            // 
            var recipeID
            var userID
            var title
            var time
            var cookingTime
            var image
            var like
            var serving
            var genres
            var VIP
    
            querySnapshot.forEach(doc => {
    
                const data = doc.data()
    
                recipeID = data["recipeID"];
                userID = data["userID"];
                title = data["title"];
                time = data["time"];
                cookingTime = data["cookingTime"];
                image = data["image"];
                like = data["like"];
                serving = data["serving"];
                VIP = data["VIP"];
    
            });
    
            console.log(recipeID)
    
            // console.log(genres);
        }, err => {
            console.log(`Encountered error: ${err}`);
        });
        return null;
    });
    
[/code]

**エラー文**

[code]

    Warning, FIREBASE_CONFIG and GCLOUD_PROJECT environment variables are missing. Initializing firebase-admin will fail
    
[/code]

### 試したこと

  * node.js version 8のダウングレード  
node.js 10だとFIREBASE_CONFIGという環境変数を参照できないが、８だとできるため。  
その後、index.jsを実行したが、同じエラーが出てきてできず

  * 環境変数FIREBASE_CONFIGをパースし、それをadmin.initializeAppのApp.optionsのprojectIDの値とする  
上記のエラー文は消えず、さらに以下のエラーが出る

`Unexpected token u in JSON at position 0 at JSON.parse (<anonymous>)`

どうやら  
const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG)["projectId"]  
のprocess.env.FIREBASE_CONFIGがundefinedのためパースできない模様。ということは環境変数FIREBASE_CONFIGが設定されているか、存在しなければこの方法はできないと予測。

  * firebase CLI

    1. install -g firebase-tools

    2. firebase init

    3. firebase serve --only functions
    4. firebase deploy --only functions

    5. gcloud functions deploy FUNCTION_NAME --remove-env-vars FOO または  
gcloud functions deploy FUNCTION_NAME --clear-env-vars

一回firebase公式ドキュメントを見て環境変数を変数したのか環境変数を参照したところ

[code]

    {
    slack {
    key: 
    id:
    }
    
[/code]

うろ覚えですが、こんな表示が出てきたので（おそらく環境変数slack？）上記のコマンドどちらかをターミナルで実行。エラーの変化なし。

## 環境

npm -v 6.14.5  
node -v v14.2.0  
visual studio code Version: 1.44.2  
node.js  
firebase (cloud functions, cloud firestore)

１２時間ぐらい調べたり、いろいろ試したのですが英語の記事やgithubのdisscussionを読んでも自分の状況に合っている回答なのか分からず、また日本語の記事が圧倒的に少ないこと、元々はswiftでiosの開発のみ７、８ヶ月勉強しているだけの人間なのでjavascriptの知識が全くなく、それ以前のitのバックグランドを持っていないこともあり、おそらく記事が日本語であってもよくわかっていない状況です。（一応現在留学中なのである程度英語は読んだり聞いたりはできるかなと思います。）初心者で至らないところもありますが、回答していただけると嬉しいです。よろしくお願いします。


CC BY-SA 4.0
2020-05-20T18:39:29.623
66824
2020-05-21T00:04:45.830
2020-05-21T00:04:45.830
3060
36001
question
node.js firebase npm
環境変数がない(FIREBASE_CONFIG and GCLOUD_PROJECT environment variables are missing）