Node.js
Firebase

Firebaseでfunctionが動作しないときはNode.jsのバージョンを確認すると良いかもしれない

Webアプリケーション作ってみたいなー、Firebaseが激アツらしいからCodeLabをやって試してみよう!とCloud Functions for Firebaseに取り組んでいたのですが、ログインの実装まで終わったときにSign-Inボタンを押してもGoogleの認証画面が立ち上がらない≒functionが動作しないという場面がありました。その原因はNode.jsのバージョンが推奨のものと違ってたからだったので、知見として残しておきます。

ちなみに、環境はmacOS High Sierra 10.13.4です。

Firebase serveの起動ログを確認

firebase serveでFirebaseのローカルサーバーを起動したとき、次のログが出ていた場合、Node.jsのバージョンが原因かもしれません。

Warning: You're using Node.js v10.4.0 but Google Cloud Functions only supports v6.11.5.

GitHubでのissueでも同じ事象が報告されており、ここから「まずはNode.jsのバージョンを下げないとだめだな」と判断しました。

こちらのissueを見ても、直接的な原因は違っていたとしても、Node.jsのバージョンを下げることが推奨されています。

Node.jsのダウングレード

利用できるNode.jsのバージョンを確認

nodebrew ls-remoteで利用できるNode.jsのバージョンを確認します。Node.jsはnodebrewでインストールしてあることを前提に進めます。それ以外の方法でインストールした場合、別の記事を参考にしてバージョンをFirebase推奨バージョンに合わせて下さい。

~ $ nodebrew ls-remote
v0.0.1    v0.0.2    v0.0.3    v0.0.4    v0.0.5    v0.0.6

v0.1.0    v0.1.1    v0.1.2    v0.1.3    v0.1.4    v0.1.5    v0.1.6    v0.1.7
v0.1.8    v0.1.9    v0.1.10   v0.1.11   v0.1.12   v0.1.13   v0.1.14   v0.1.15
v0.1.16   v0.1.17   v0.1.18   v0.1.19   v0.1.20   v0.1.21   v0.1.22   v0.1.23
v0.1.24   v0.1.25   v0.1.26   v0.1.27   v0.1.28   v0.1.29   v0.1.30   v0.1.31
v0.1.32   v0.1.33   v0.1.90   v0.1.91   v0.1.92   v0.1.93   v0.1.94   v0.1.95
v0.1.96   v0.1.97   v0.1.98   v0.1.99   v0.1.100  v0.1.101  v0.1.102  v0.1.103
v0.1.104

v0.2.0    v0.2.1    v0.2.2    v0.2.3    v0.2.4    v0.2.5    v0.2.6

v0.3.0    v0.3.1    v0.3.2    v0.3.3    v0.3.4    v0.3.5    v0.3.6    v0.3.7
v0.3.8

v0.4.0    v0.4.1    v0.4.2    v0.4.3    v0.4.4    v0.4.5    v0.4.6    v0.4.7
v0.4.8    v0.4.9    v0.4.10   v0.4.11   v0.4.12

v0.5.0    v0.5.1    v0.5.2    v0.5.3    v0.5.4    v0.5.5    v0.5.6    v0.5.7
v0.5.8    v0.5.9    v0.5.10

v0.6.0    v0.6.1    v0.6.2    v0.6.3    v0.6.4    v0.6.5    v0.6.6    v0.6.7
v0.6.8    v0.6.9    v0.6.10   v0.6.11   v0.6.12   v0.6.13   v0.6.14   v0.6.15
v0.6.16   v0.6.17   v0.6.18   v0.6.19   v0.6.20   v0.6.21

v0.7.0    v0.7.1    v0.7.2    v0.7.3    v0.7.4    v0.7.5    v0.7.6    v0.7.7
v0.7.8    v0.7.9    v0.7.10   v0.7.11   v0.7.12

v0.8.0    v0.8.1    v0.8.2    v0.8.3    v0.8.4    v0.8.5    v0.8.6    v0.8.7
v0.8.8    v0.8.9    v0.8.10   v0.8.11   v0.8.12   v0.8.13   v0.8.14   v0.8.15
v0.8.16   v0.8.17   v0.8.18   v0.8.19   v0.8.20   v0.8.21   v0.8.22   v0.8.23
v0.8.24   v0.8.25   v0.8.26   v0.8.27   v0.8.28

v0.9.0    v0.9.1    v0.9.2    v0.9.3    v0.9.4    v0.9.5    v0.9.6    v0.9.7
v0.9.8    v0.9.9    v0.9.10   v0.9.11   v0.9.12

v0.10.0   v0.10.1   v0.10.2   v0.10.3   v0.10.4   v0.10.5   v0.10.6   v0.10.7
v0.10.8   v0.10.9   v0.10.10  v0.10.11  v0.10.12  v0.10.13  v0.10.14  v0.10.15
v0.10.16  v0.10.17  v0.10.18  v0.10.19  v0.10.20  v0.10.21  v0.10.22  v0.10.23
v0.10.24  v0.10.25  v0.10.26  v0.10.27  v0.10.28  v0.10.29  v0.10.30  v0.10.31
v0.10.32  v0.10.33  v0.10.34  v0.10.35  v0.10.36  v0.10.37  v0.10.38  v0.10.39
v0.10.40  v0.10.41  v0.10.42  v0.10.43  v0.10.44  v0.10.45  v0.10.46  v0.10.47
v0.10.48

v0.11.0   v0.11.1   v0.11.2   v0.11.3   v0.11.4   v0.11.5   v0.11.6   v0.11.7
v0.11.8   v0.11.9   v0.11.10  v0.11.11  v0.11.12  v0.11.13  v0.11.14  v0.11.15
v0.11.16

v0.12.0   v0.12.1   v0.12.2   v0.12.3   v0.12.4   v0.12.5   v0.12.6   v0.12.7
v0.12.8   v0.12.9   v0.12.10  v0.12.11  v0.12.12  v0.12.13  v0.12.14  v0.12.15
v0.12.16  v0.12.17  v0.12.18

v4.0.0    v4.1.0    v4.1.1    v4.1.2    v4.2.0    v4.2.1    v4.2.2    v4.2.3
v4.2.4    v4.2.5    v4.2.6    v4.3.0    v4.3.1    v4.3.2    v4.4.0    v4.4.1
v4.4.2    v4.4.3    v4.4.4    v4.4.5    v4.4.6    v4.4.7    v4.5.0    v4.6.0
v4.6.1    v4.6.2    v4.7.0    v4.7.1    v4.7.2    v4.7.3    v4.8.0    v4.8.1
v4.8.2    v4.8.3    v4.8.4    v4.8.5    v4.8.6    v4.8.7    v4.9.0    v4.9.1


v5.0.0    v5.1.0    v5.1.1    v5.2.0    v5.3.0    v5.4.0    v5.4.1    v5.5.0
v5.6.0    v5.7.0    v5.7.1    v5.8.0    v5.9.0    v5.9.1    v5.10.0   v5.10.1
v5.11.0   v5.11.1   v5.12.0

v6.0.0    v6.1.0    v6.2.0    v6.2.1    v6.2.2    v6.3.0    v6.3.1    v6.4.0
v6.5.0    v6.6.0    v6.7.0    v6.8.0    v6.8.1    v6.9.0    v6.9.1    v6.9.2
v6.9.3    v6.9.4    v6.9.5    v6.10.0   v6.10.1   v6.10.2   v6.10.3   v6.11.0
v6.11.1   v6.11.2   v6.11.3   v6.11.4   v6.11.5   v6.12.0   v6.12.1   v6.12.2
v6.12.3   v6.13.0   v6.13.1   v6.14.0   v6.14.1   v6.14.2

...

Firebaseで求められているバージョンはv6.11.5です。nodebrewでインストールできそうですね。それにしてもすごい数のバージョンがリリースされています。

v6.11.5をインストール

nodebrew install-binaryでFirebaseが推奨するバージョンのNode.jsをインストールします。install-binaryでないと、後方互換性を保ってインストールできないようです。詳しくは参考URLの記事を参照してください。

~ $ nodebrew install-binary v6.11.5
Fetching: https://nodejs.org/dist/v6.11.5/node-v6.11.5-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully

無事インストールできたようです。

インストールされたバージョンの確認

nodebrew lsで現在利用しているバージョンと、インストールされているバージョンを確認します。

~ $ nodebrew ls
v6.11.5
v8.9.4
v10.4.0

current: v10.4.0

利用するバージョンを変更

今はv10.4.0を利用していますから、nodebrew useで利用するバージョンを変更します。

~ $ nodebrew use v6.11.5
use v6.11.5

変更後

~ $ nodebrew ls
v6.11.5
v8.9.4
v10.4.0

current: v6.11.5

念のためnode -vでもNode.jsが利用するバージョンが変わったことを確認します。

~ $ node -v
v6.11.5

Firebase側での動作確認

firebase-toolsの再インストール

この時点でfirebase serveを実行すると、コマンドが見つからない、というエラーになります。

~/Git/friendlychat-web/web-start $ firebase serve
bash: /Users/xxx.nodebrew/current/bin/firebase: No such file or directory

Node.jsのバージョンごとにfirebase-toolsをインストールする必要があるようです。

firebase-toolsの再インストール

というわけで、再度npm -g install firebase-toolsでfirebase-toolsをインストールします。今回は/friendlychat-web/web-startディレクトリにfirebaseのプロジェクトが存在するので、そこに移動してfirebaseコマンドを打ちます。

~/Git/friendlychat-web/web-start $ npm -g install firebase-tools
/Users/xxx.nodebrew/node/v6.11.5/bin/firebase -> /Users/xxx.nodebrew/node/v6.11.5/lib/node_modules/firebase-tools/bin/firebase

> @google-cloud/functions-emulator@1.0.0-beta.4 postinstall /Users/xxx.nodebrew/node/v6.11.5/lib/node_modules/firebase-tools/node_modules/@google-cloud/functions-emulator
> node scripts/upgrade-warning


If you're using the Emulator via the Firebase CLI, you can
disregard this message.

If you're upgrading @google-cloud/functions-emulator, these
are the recommended upgrade steps:

1.  Stop the currently running emulator, if any:

        functions stop

2.  Uninstall the current emulator, if any:

        npm uninstall -g @google-cloud/functions-emulator

3.  Install the new version of the emulator:

        npm install -g @google-cloud/functions-emulator

If you have trouble after upgrading, try deleting the config
directory found in:

    ~/.config/configstore/@google-cloud/functions-emulator

Then restart the emulator. You can also check for any renegade
Node.js emulator processes that may need to be killed:

    ps aux | grep node

/Users/xxx.nodebrew/node/v6.11.5/lib
└─┬ firebase-tools@3.18.6
  ├─┬ @google-cloud/functions-emulator@1.0.0-beta.4
  │ ├─┬ @google-cloud/storage@1.6.0
...

firebase-toolsはインストールできたようですが、念のためfirebase --versionでFirebaseが存在することを確認します。

~/Git/friendlychat-web/web-start $ firebase --version
3.18.6

サーバーを起動して確認

最後に、firebase serveでFirebaseのサーバーを起動し、動作確認をします。今回だとSign-Inを押したときにGoogleの認証画面が表示されれば動作している、と判断します。

~/Git/friendlychat-web/web-start $ firebase serve

=== Serving from '/Users/xxx/Git/friendlychat-web/web-start'...

i  functions: Preparing to emulate functions.
i  hosting: Serving hosting files from: ./
✔  hosting: Local server: http://localhost:5000<img width="1279" alt="ログイン_-_Google_アカウント_と_Friendly_Chat.png" src="https://qiita-image-store.s3.amazonaws.com/0/117345/e02ba7b5-cf3c-6956-6faa-b536218dd9a8.png">


i  functions: No HTTPS functions found. Use firebase functions:shell if you would like to emulate other types of functions.
127.0.0.1 - - [09/Jun/2018:12:45:32 +0000] "GET /__/firebase/init.js HTTP/1.1" 200 - "http://localhost:5000/" "Mozilla/5.0 (Macintosh; Intel Mac OSX 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"
...

ログイン_-_Google_アカウント_と_Friendly_Chat.png

ログイン認証画面が出てきました!これでfunctionはきちんと動作したことがわかります。

まとめ

  • functionが動作しないときはNode.jsのバージョンを確認する
  • 動作ログはinfoでも大事なことが書いてある
  • でも公式ドキュメントにはNode.jsの推奨バージョンが書いてないのではまりどころになりそうだと思った(書いてあるところ知っている人がいれば教えて欲しいです…)

Node.jsの推奨バージョンは公式ドキュメントGoogle Cloud Platformに記載があるとの情報をいただきました。ありがとうございます!

参考URL