web-dev-qa-db-ja.com

Firebaseのクラウド機能をPCでローカルにテストする方法

今日、Firebaseはその真新しい製品 Firebaseのクラウド機能 をリリースし、hello world関数を作成し、それを既存のfirebaseプロジェクトにデプロイしました。

aws lambda functionと同じように、すべての依存関係をバンドルし、firebaseにアップロードするようです。しかし、コードのわずかな変更でも処理に時間がかかりすぎ、インターネットの良好な接続性も必要です。何らかの理由でオフラインになっている場合は、ローカルマシンでその機能をオフラインで実行およびテストする方法ができるまで、書いているコードが暗くなっています。

Firebaseのクラウド機能をローカルでテストする方法はありますか?

31
Inzamam Malik

ファイアーベースラーはこちら

実際、関数の展開には、通常私が待ち望んでいる以上の時間がかかります。私たちはそれを改善するために一生懸命取り組んでおり、(ブレンダンが言ったように)ローカルエミュレーターに取り組んでいます。

しかし、当面は、ほとんどの場合、実際のビジネスロジックを別個のNodeスクリプトに最初に記述します。この方法で、ローカルコマンドプロンプトからnode speech.jsを使用してテストできます。関数が機能することを確認したら、それをコピーして実際の関数ファイルに貼り付けるか、(より良い)speechモジュールを関数ファイルにインポートして、そこから呼び出します。

簡単に掘り下げた簡単な例の1つは、Cloud Vision APIを使用してテキスト抽出を接続していたときです。次を含むocr.jsというファイルがあります。

var fetch = require('node-fetch');

function extract_text(url, gcloud_authorization) {
  console.log('extract_text from image '+url+' with authorization '+gcloud_authorization);

  return fetch(url).then(function(res) {
    return res.buffer();
  }).then(function(buffer) {
    return fetch('https://vision.googleapis.com/v1/images:annotate?key='+gcloud_authorization, {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        "requests":[
          {
            "image":{
              "content": buffer.toString('base64')
            },
            "features":[
              {
                "type":"TEXT_DETECTION",
                "maxResults":1
              }
            ]
          }
        ]
      })
    });
  }).then(function(res) {
    var json = res.json();
    if (res.status >= 200 && res.status < 300) {
      return json;
    } else {
      return json.then(Promise.reject.bind(Promise));
    }
  }).then(function(json) {
    if (json.responses && json.responses.length && json.responses[0].error) {
      return Promise.reject(json.responses[0].error);
    }
    return json.responses[0].textAnnotations[0].description;
  });
}

if (process.argv.length > 2) {
  // by passing the image URL and gcloud access token, you can test this module
  process.argv.forEach(a => console.log(a));
  extract_text(
    process.argv[2], // image URL
    process.argv[3]  // gcloud access token or API key
  ).then(function(description) {
    console.log(description);
  }).catch(function(error) {
    console.error(error);
  });
}

exports.extract_text = extract_text;

そして、関数index.jsには、次のものがあります:

var functions = require('firebase-functions');
var fetch = require('node-fetch');
var ocr = require('./ocr.js');

exports.ocr = functions.database().path('/messages/{room}/{id}').onWrite(function(event) {
  console.log('OCR triggered for /messages/'+event.params.room+'/'+event.params.id);

  if (!event.data || !event.data.exists()) return;
  if (event.data.ocr) return;
  if (event.data.val().text.indexOf("https://firebasestorage.googleapis.com/") !== 0) return; // only OCR images

  console.log(JSON.stringify(functions.env));

  return ocr.extract_text(event.data.val().text, functions.env.googlecloud.apikey).then(function(text) {
    return event.data.adminRef.update({ ocr: text });
  });
});

ご覧のとおり、この最後のファイルは、実際には「ワーカーメソッド」ocr.extract_textをデータベースの場所に接続するだけです。

これは少し前のプロジェクトであるため、構文の一部(主にfunctions.env部分)が少し変更されている可能性があります。

23

firebaser here

Firebase用のCloud Functionsをローカルでデバッグするために、エミュレーターがあります。 詳細はドキュメント をご覧ください。

17
Brendan G. Lim

関数をローカルで実行およびデバッグ/検査する

前提条件(google-cloud機能およびfirebase固有):

npm install -g @google-cloud/functions-emulator
npm install --save firebase-functions
npm install -g firebase-tools

実行して検査/デバッグするには:最初に関数をローカルで実行し、次に各関数を検査し、最後に特定の各関数を実行してデバッグ+検査します。つかいます functions startの代わりとしてfirebase serveそして、各ツールのドキュメントが利用可能(かつ有用)であることに注意してください。

特定の関数myFnを期待どおりに実行およびデバッグするには(例: Nodejschrome://inspectそして、これはNodejs v10を使用して機能しますが、公式にはサポートされていません)。

firebase serve --only functions
functions inspect myFn
functions call myFn # or call from browser

追加のドキュメント:

https://firebase.google.com/docs/functions/local-emulatorhttps:// cloud。 google.com/functions/docs/emulator#debug-emulatorhttps://github.com/GoogleCloudPlatform/cloud-functions-emulator/wiki

9
Inzamam Malik

HTTP関数(webhookなど)をデバッグするvscodeユーザーの場合...

Googleクラウドエミュレーター(firebase serve --only functions)は、別のプロセスを起動して関数を実行します。 vscodeを使用してこのプロセスにアタッチできますが、エミュレータはこのプロセスを作成するだけですafter最初の関数が呼び出されるため、簡単ではありません。

  • processIDを返すダミーのHTTPエンドポイントを関数に作成します。
app.get("/processid", function(request, response) {
  response.send(`${process.pid}`);
});
  • firebase serve --only functionsでエミュレーターを起動します
  • http://<localhost_url>/processidエンドポイントを呼び出します。これにより、プロセスが作成され、processIDが返されます
  • vscodeを使用して、指定されたプロセスにアタッチします。これで、他の任意の関数にブレークポイント、ステップなどを設定できます(これらはすべて同じプロセスを使用します)。

おそらく、これらすべてを一緒に接着するより良い方法があります。

1
adelphus

最初はシングルステップを動作させることができませんでした。私のプロセスは、ここで多くの回答に記載されているものと同じでした。

また、これらのページには、必要なほぼすべてのドキュメントが含まれています。

firebase serve --only functionsを使用して関数を実行していましたが、デバッガを起動して実行していませんでした。次に、エミュレータを直接使用する別の方法に出会い、次のようなブレークポイントに到達しました:

# start the emulator
functions start

# allow inspection
functions inspect helloWorld

# call the function from the cli
functions call helloWorld

これは機能し、ブレークポイントに到達できました。

しかし、郵便配達員またはブラウザで関数のエンドポイントを押すと、まったく応答がありませんでした。

私が行方不明だったステップは次のとおりでした:

# deploy the function to the emulator
functions deploy helloWorld --trigger-http

# you need to toggle inspection after the deploy
functions inspect helloWorld

これで、郵便配達員またはブラウザから関数のエンドポイントにヒットでき、ブレークポイントにヒットします。

デバッグには素晴らしい NiM chrome extension をお勧めします。これが古い質問であっても、この答えが誰かの役に立つことを願っています。

1
plumpNation

ここで回答: https://github.com/firebase/firebase-functions/issues/4#issuecomment-286515989

また、Google Cloud Functionsはローカルエミュレーターをオープンソース化し、Cloud Functions for Firebaseとの緊密な統合の構築に取り組んでいます。それまでの間、こちらで確認できます: https://github.com/GoogleCloudPlatform/cloud-functions-emulator/

エミュレーターでは、ローカルで機能を実行できます。使用方法を説明するドキュメントは次のとおりです。 https://cloud.google.com/functions/docs/emulator

1
Inzamam Malik

まず、次の依存関係をインストールすることをお勧めします。

npm install --save firebase-functions
npm install -g firebase-tools 

既にインストールされている場合は、最新のものに更新できます。一般的に、functions-emulatorには上記の依存関係がありますが、それでも更新することをお勧めします。

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

更新されたら、アプリケーションの機能フォルダーに移動し、次のコマンドを実行します。

firebase serve --only functions

お役に立てば幸いです!

0
imbond