2017-06-09 1 views
5

私はポリマー2.0とpolymerfireを使用して構築されたPWAを持っており、私のウェブアプリケーションです。私はクラウド機能(マイクロサービス)として動作する明示的なアプリを持っています。 例:上記のアプリregister/fns/register/fns/verifyを言うマッピングするために書き換えルールを追加する方法exports.register=functions.https.onRequest(app);特定の要求をクラウド機能にルーティングするためにfirebase-hosting内で書き換えルールを設定するにはどうすればよいですか?

クラウド機能のマイクロサービスプロジェクトでfirebase.jsonファイルを更新しましたが、firebase deploy --only functions:registerを実行すると、ホスティング設定を展開するためのパブリックフォルダがありません。

{ 
    "hosting": { 
     "rewrites": [{ 
      "source": "/fns/**", "function": "register" 
     }] 
    }  
} 

元のWebアプリケーションで書き換えルールを維持することも可能ですが、理想的なIMHOではありません。元のWebアプリケーションでそれをやろうとしたら、それもやってみましたが、できませんでした。私の私の元のWebアプリケーションにfirebase.jsonを更新し、次のとおりです。すべてのリソースのひとつのプロジェクト(ホスティング、機能およびデータベース)を維持

{ 
    "database": { 
    "rules": "database.rules.json" 
    }, 
    "hosting": { 
    "public": "build/default/public", 
    "rewrites": [ 
     { 
     "source": "/fns/**", 
     "function": "register" 
     }, 
     { 
     "source": "**", 
     "destination": "/index.html" 
     } 
    ] 
    } 
} 

答えて

9

は理想的ですが、私はFirebaseのプロジェクトを管理するための正しい方法だと思います。

ホスティングサービスのパラメータを1つだけ変更(書き換え)しようとしていますが、これは動作しません。 firebase.jsonをデプロイすると、他のすべての設定が上書きされます。だから、Firebaseは最後の設定ファイルを見ずに何が違うのかを確認するだけなので、最後の設定ファイルをすべて上書きしようとしていて、 "public"はホスティングに必要なパラメータなのでエラーが出ます。

これで、Firebaseが/fns/registerをただちに/registerに書き換えることを期待していますが、それは発生しません。あなたの関数は "フル" URL /fns/registerを受け取るでしょう。

最良の方法は、私が思うに、ルートルートを作成することです:

var functions = require('firebase-functions'); 
var express = require('express'); 

var app = express(); 
var router = express.Router(); 

router.post('/register', registerFunction); 
router.post('/verify', verifyFunction); 

app.use('/fns', router); 

exports.fns = functions.https.onRequest(app); 

そしてfns機能へのすべての機能を書き換え:

{ 
    "database": { 
    "rules": "database.rules.json" 
    }, 
    "hosting": { 
    "public": "build/default/public", 
    "rewrites": [ 
     { 
     "source": "/fns/**", 
     "function": "fns" 
     }, 
     { 
     "source": "**", 
     "destination": "/index.html" 
     } 
    ] 
    } 
} 

今、あなたはあなたのレジスタの機能に到達するためにを使用することができます照合機能に達するにはhttps://<your-project-id>.firebaseapp.com/fns/verifyが必要です。

+0

ありがとうございます@Marcos Vの答えです。しかし、Google IO 2017からの継続的な提案はマイクロサービスのために行くことです。したがって、ただ1つのプロジェクトを持つことは、私が探している素晴らしいソリューションではありません。私は、その敏捷性、スケーラビリティ、およびエラーのローカライゼーションのために、マイクロサービススタイルに着手したいと考えています。あなたの答えを受け入れることができませんでした。 – Phani

+0

@Phaniあなたの質問のタイトルには、別々のプロジェクトの要件はまったく言及されていません。たぶんあなたはこの答えを受け入れることができます(あなたの主要な質問に答えます)。別のプロジェクトで書き換えのルールと機能を維持する方法の別の質問を開きますか? – Motin

+0

1つのプロジェクトにすべてのホスティング、機能、データベースを維持することはマイクロサービスの世界では理想的ではないため、これをソリューション@Motinとして受け入れることはできません。私は、ホスティングファイルが1つのメインプロジェクト(ただし理想的ではない)にしか存在しないことを受け入れることは、むしろOKです。しかし、この機能は他のプロジェクトにも数多く存在することができ、データベースは別のプロジェクトに統合することができます。これはマイクロサービスのアプローチであり、私はこれを既に実行しています。 – Phani

0

この質問はすでにここFirebase Hosting with dynamic cloud functions rewrites

私はそれが別のものであるプロジェクトでSPAとmicroserviceを保つために最善であることをあなたに同意したが@Marcosがルート機能

を使用することについて、正しいをV答えています
0

私はMarcos Vの答えをアップに投票しましたが、私は答えとしてそれを本当に受け入れることはできません。主にマイクロサービスの世界では、1つの場所にすべての機能を備えたモノリスを作成しないためです。むしろ、管理可能なチャンクに分割し、アプリケーションに必要/妥当な数の適切なマイクロサービスを作成します。

firebase-hostingによる現在の設定では、1つのプロジェクトだけでホスト構成ファイルを用意する必要があります。また、あなたのサイトに関連するすべてのHTML、JS、CSSが相互依存性を持ち、したがって(少なくとも今のところは)分離不可能であるため、ホスティングは1つのプロジェクトに含まれます。

ただし、クラウド機能は、決定的な目的を果たすマイクロサービスと見なされるため、必要に応じて別々のプロジェクト/マイクロサービスに配置する必要があります。 firebase deploy --only functions:YOUR_FN_NAME

新しいクラウド機能のマイクロサービス用にマッピングを追加する必要がある場合は、メインホスティングアプリケーションでルーティングを変更して展開してください。このアプローチでは、少なくともバックエンド部分をマイクロサービスにすることができます。

同じホスティングアプリケーションまたは別のプロジェクトにデータベースルールを維持することは、そのユースケースに基づいて決定できるデザイナーに委ねられます。

関連する問題