今朝から、Firebaseアプリケーションで問題が発生しました。書き込みデータをリアルタイムデータベースインスタンスに送信します。 1つのキーと値のペアをオブジェクトに追加するなどの最も単純なタスクでもトリガーされます
Error: TRIGGER_PAYLOAD_TOO_LARGE: This request would cause a function payload exceeding the maximum size allowed.
私たちのコードやデータベースは24時間以上何も変更されていないので、これは特に奇妙です。
単純なものでも
Database.ref('environments/' + envkey).child('orders/' + orderkey).ref.set({a:1})
エラーをトリガーします。
明らかに、ペイロードのサイズは問題ではありませんが、これを引き起こしている可能性があるのは何ですか?
要求に応じたデータベース構造
environments +-env1 +-env2 --+orders ---+223344 -----customer: "Peters" -----country: "NL" -----+items ------item1 -------code: "a" -------value: "b" ------item2 -------code: "x" -------value: "2"
わかりました、これを理解しました。この問題は書き込み関数とは関係ありませんが、書き込みアクションがトリガーするクラウド関数の1つに関係しています。
たとえば、次のような構造があります。/collections/data/abcd/items/a
JSONの場合:
"collections": {
"data": {
"abc": {
"name": "example Col",
"itemCount": 5,
"items": {
"a": {"name": "a"},
"b": {"name": "b"},
"c": {"name": "c"},
"d": {"name": "d"},
"e": {"name": "e"},
}
}
}
}
アイテムへの書き込みはまったく失敗していました。 API、Javascript、さらにはコンソールでの基本的な書き込み。
私はクラウド機能を調べることにし、これを見つけました:
const countItems = (collectionId) => {
return firebaseAdmin.database().ref(`/collections/data/${collectionId}/items`).once('value')
.then(snapshot => {
const items = snapshot.val();
const filtered = Object.keys(items).filter(key => {
const item = items[key];
return (item && !item.trash);
});
return firebaseAdmin.database().ref(`/collections/meta/${collectionId}/itemsCount`)
.set(filtered.length);
});
};
export const onCollectionItemAdd = functions.database.ref('/collections/data/{collectionId}/items/{itemId}')
.onCreate((change, context) => {
const { collectionId } = context.params;
return countItems(collectionId);
});
それ自体は何もありませんが、そのトリガーはすべてのアイテムを読み取り、デフォルトでは、Firebaseクラウド関数はスナップショット全体をCFに送信します(使用しない場合でも)。実際には、前の値と後の値も送信するので、(私たちのように)その時点で大量のアイテムがある場合、クラウド関数に送信しようとするペイロードが大きすぎると思います。
CFとブームからカウント機能を削除し、通常の状態に戻しました。トリガーをまったく取得できない場合のカウントの「正しい」方法はわかりませんが、トリガーが発生した場合はこれを更新します...
TRIGGER_PAYLOAD_TOO_LARGEエラーは、Firebaseが展開している新機能の一部であり、 既存のRTDB制限 が厳密に適用されています。変更の理由は、Cloud Functionsトリガーをサイレントにドロップしないようにするためです。これらの制限を超えるイベントは、Functionsに送信できないためです。
これを行うことで、この機能を自分でオフにすることができますREST call:
curl -X PUT -d "false" https://<namespace>.firebaseio.com/.settings/strictTriggerValidation/.json?auth\=<SECRET>
どこ <SECRET>
はあなたです DBシークレット
これを無効にすると、現在失敗しているリクエストが通過する可能性がありますが、制限を超えたリクエストでトリガーされるクラウド関数は実行に失敗することに注意してください。関数にデータベーストリガーを使用している場合は、制限内に収まるようにリクエストを再構成することをお勧めします。