エミュレータ起動時のエラー
エミュレータを起動しようとしたところ、以下のエラーが起きました。
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でデータベースの値を参照するはずが、取得できませんでした。
調べると、エミュレータでは独立したデータベースになるようです。