edo1z blog

プログラミングなどに関するブログです

firebase functions + Hosting + vue のメモ

前も下記にメモりましたが、やるたびに忘れるのでメモります。

blog.logicky.com

Hosting, Functions

$ firebase init

下記でプロジェクトを切り替えられます。切り替えられるプロジェクトは.firebasercに書いてあります。firebase use --add的なもので追加できます。直接書いてもOKです。

$ firebase use dev

切り替えたプロジェクトに対してデプロイできます。

$ firebase deploy --only hosting
$ firebase deploy --only functions

vue-cliでの環境切り替え

Firebaseの開発環境・本番環境の切り替えは、vue cliの場合、下記が使えます。

.env.development
.env.production

yarn serve すると、.env.developmentが使われます。 yarn buildすると、.env.productionが使われます。 中身は例えば下記のようになります。

VUE_APP_VERSION = "0.1.0"
VUE_APP_FB_API_KEY = "AAI*************************AhubyA"
VUE_APP_FB_AUTH_DOMAIN = "*****.firebaseapp.com"
VUE_APP_FB_DATABASE_URL = ""
VUE_APP_FB_PROJECT_ID = "*******"
VUE_APP_FB_STORAGE_BUCKET = ""
VUE_APP_FB_MESSAGING_SENDER_ID = ""
VUE_APP_STRIPE_PUBLIC_KEY = "********"

VUE_APPをつける必要があります。例えば、下記のように呼び出せます。

import firebase from 'firebase/app'
import 'firebase/firestore'
import 'firebase/storage'
import 'firebase/auth'
import 'firebase/functions'

const config = {
  apiKey: process.env.VUE_APP_FB_API_KEY,
  authDomain: process.env.VUE_APP_FB_AUTH_DOMAIN,
  databaseURL: process.env.VUE_APP_FB_DATABASE_URL,
  projectId: process.env.VUE_APP_FB_PROJECT_ID,
  storageBucket: process.env.VUE_APP_FB_STORAGE_BUCKET,
  messagingSenderId: process.env.VUE_APP_FB_MESSAGING_SENDER_ID
}
firebase.initializeApp(config)
export const db = firebase.firestore()
export const storage = firebase.storage()
export const auth = firebase.auth
export const functions = firebase.functions()

Functions + Hosting利用の際の注意点

  • Functionsのリージョンは、東京に設定できますが、Hosting に接続されている関数は us-central1 に配置する必要があります。。

Functionsの環境設定

下記のようにすると設定できます。 json形式なら入れられるので、jsonファイルを2番目のように読み込むことができます。

firebase functions:config:set hoge="hoge"
firebase functions:config:set hoge="$(cat functions_const.json)"

jsonファイルは例えば下記のような感じです。

{
  "mailgun": {
    "api_key": "key-2*************************",
    "domain": "mg.******.com",
    "from_address": "****@*****.com",
    "admin_address": "****@*****.com"
  }
}

下記のように利用できます。

const functions = require('firebase-functions');
const apiKey = functions.config().const.mailgun.api_key;
const domain = functions.config().const.mailgun.domain;
const mailgun = require('mailgun-js')({apiKey: apiKey, domain: domain, timeout: 10000});

exports.contactform = functions.https.onCall((data, context) => {
  try {
    return new Promise (resolve => {
      const sendData = {
        from: functions.config().const.mailgun.from_address,
        to: data.email,
        subject: 'お問合わせありがとうございます',
        text: createMessage(data)
      };
      mailgun.messages().send(sendData, (error, body) => {
        if (error) {
          console.log(error);
          return resolve({success: false, message: ''});
        } else {
          return resolve({success: true, message: ''});
        }
      });
    });
  } catch (err) {
    console.log(err);
    return {success: false, message: ''};
  }
});