マイコン温度通知システムの製作9 超過温度のLINE通知2 エミュレータの動作のエラー

エミュレータ起動時のエラー

エミュレータを起動しようとしたところ、以下のエラーが起きました。

firebase emulators:start
i  emulators: Starting emulators: functions, firestore, database, hosting, extensions
⚠  firestore: Port 8080 is not open on localhost (127.0.0.1,::1), could not start Firestore Emulator.
⚠  firestore: To select a different host/port, specify that host/port in a firebase.json config file:
      {
        // ...
        "emulators": {
          "firestore": {
            "host": "HOST",
            "port": "PORT"
          }
        }
      }
i  emulators: Shutting down emulators.

Error: Could not start Firestore Emulator, port taken.

これは8080番のポートが使用中のため発生しているエラーです。

以下のコマンドで8080番ポートを使用中のPIDを取得、killコマンドでそのIDを指定してポートを解放することでエミュレータ起動のエラーを解決できます。

$ lsof -i :8080
COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java      40034 XXX  139u  IPv6 0x2cd6cb290f444505      0t0  TCP localhost:http-alt (LISTEN)
java      40034 XXX  140u  IPv6 0x2cd6cb290f43c505      0t0  TCP localhost:http-alt->localhost:62908 (ESTABLISHED)
java      40034 XXX  143u  IPv6 0x2cd6cb290f439505      0t0  TCP localhost:http-alt->localhost:62920 (ESTABLISHED)
java      40034 XXX  144u  IPv6 0x2cd6cb290f422505      0t0  TCP localhost:http-alt->localhost:62921 (ESTABLISHED)
$ kill 40034

エミュレータを起動して動作をテストする(エラー)

都度デプロイするのは手間なのでエミュレータを起動してテストをします。

firebase emulators:start
...
✔  functions[us-central1-addLineGroupId]: http function initialized (http://127.0.0.1:5001/temperature-XXX/us-central1/addLineGroupId).
...

エミュレータ起動時に表示される上記の箇所を参考に、別途ターミナルウィンドウを開いてcurlコマンドを入力します。

% curl 'http://127.0.0.1:5001/temperature-XXX/lineMessageFunctions/sendLineMessage?macAddress=1'

ここでエミュレータのエラーが発生しました。

curl 'http://127.0.0.1:5001/temperature-XXX/us-central1/getLineGroupIdByHttpRequest?macAddress=1'
Function us-central1-getLineGroupIdByHttpRequest does not exist, valid functions are: %
curl 'http://127.0.0.1:5001/temperature-XXX/us-central1/lineMessageFunctions/sendLineMessage?macAddress=1'
Function us-central1-lineMessageFunctions does not exist, valid functions are: us-central1-addTemperatureData, us-central1-sendLineMessage, us-central1-addLineGroupId, us-central1-testCode%

これらは作成したプログラムでインポートするファイル名や関数名の誤りがあるため発生しているようです。

下段の例の場合、ファイル名「lineMessageFunctions」を入れず、直接関数名「sendLineMessage」を入れる必要があります。

以下が正しい記述になります。

curl 'http://127.0.0.1:5001/temperature-XXX/us-central1/sendLineMessage?macAddress=1'

エミュレータのログが確認できない

・firebaseDataAccessor.js

async function getLineGroupId(macAddress) {
  const associationTableRef = db.collection("associationTable");
  const snapshot = await associationTableRef
      .where("macAddress", "==", macAddress).get();

  if (snapshot.empty) {
    console.log("該当するデータが見つかりません。");
    return null;
  }

 

・testCode.js

exports.getLineGroupIdByHttpRequest =
    functions.https.onRequest(async (req, res) => {
    // HTTPリクエストからMACアドレスを取得
      const macAddress = req.query.macAddress;
      if (!macAddress) {
        return res.status(400).send("MACアドレスがリクエストに含まれていません。");
      }

      try {
        const lineGroupId = await firebaseDataAccessor.
            getLineGroupId(macAddress);
        if (lineGroupId) {
          res.status(200).send({lineGroupId: lineGroupId});
        } else {
          res.status(404).send("対応するLine Group IDが見つかりません。");
        }
      } catch (error) {
        console.error("エラー発生:", error);
        res.status(500).send("サーバーでエラーが発生しました。");
      }
    });

上記のコードを含むプログラムをエミュレータで起動し、HTTPリクエストを実施します。

(testCode.jsの「getLineGroupIdByHttpRequest」がfirebaseDataAccessor.jsの「getLineGroupId」を利用しています)

・HTTPリクエスト

curl 'http://127.0.0.1:5001/temperature-XXX/us-central1/getLineGroupIdByHttpRequest?macAddress=AAABBB'
対応するLine Group IDが見つかりません。%

このHTTPリクエストを実施したターミナルでは、firebaseDataAccessor.jsのエラーメッセージを見ることはできません。

エラーメッセージを確認するにはもう1つのエミュレータを起動したターミナルを確認します。

・エミュレータを起動したターミナル

i  functions: Beginning execution of "us-central1-getLineGroupIdByHttpRequest"
>  該当するデータが見つかりません。

上記のように確認できました。

コレクション(データベース)を確認できない

上記のfirebaseDataAccessor.jsでデータベースの値を参照するはずが、取得できませんでした。

調べると、エミュレータでは独立したデータベースになるようです。

タイトルとURLをコピーしました