問題タブ [google-cloud-firestore]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
1484 参照

json - Nodejs、Cloud Firestore アップロード タスク - 認証エラー:エラー: ソケット ハングアップ

API 呼び出しを実行し、巨大なデータベースからオフセットを介して順番に JSON を要求する関数をコーディングしています。JSON レスポンスが解析され、その後のデータが Cloud Firestore サーバーにアップロードされます。

Nodejs (Node 6.11.3) & 最新の Firebase Admin SDK

情報は期待どおりに解析され、コンソールに完全に出力されます。ただし、データを Firestore データベースにアップロードしようとすると、コンソールに次のエラー メッセージが表示されます。

認証エラー:エラー: ソケットがハングアップしました

(ノード:846) UnhandledPromiseRejectionWarning: 未処理の promise 拒否 (拒否 ID: -Number-): エラー: プラグインからのメタデータの取得がエラーで失敗しました: ソケットがハングアップしました

そして時折:

認証エラー: エラー: ECONNRESET の読み取り

forEach 関数は、ダウンロードされた JSON からアイテムを収集し、Firestore データベースにアップロードする前にデータを処理します。各 JSON には、forEach 関数を通過する最大 1000 項目のデータ (1000 ドキュメント相当) があります。アップロード セットが完了する前に関数が繰り返される場合、これが問題になる可能性があることを理解していますか?

私はコーディングの初心者であり、この関数の制御フローが最適ではないことを理解しています。ただし、コンソールに表示されるエラーに関する情報は見つかりません。ソケットのハングアップに関する情報はたくさんありますが、認証エラーのセクションにはありません。

生成されたサービス アカウント JSON を資格情報として使用して、firebase-adminsdk アカウントを使用するデータベースにアクセスしています。データベースの読み取り/書き込みルールは現在、すべてのアクセスを許可するために開かれています (実際のユーザーなしで開発中であるため)。

これが私の機能です:

Firebase の初期化とオフセットのゼロ化

関数の実行と HTTP ヘッダーの設定

API からの応答の最後に到達していない場合は、HTTP 要求を実行して関数を再実行します。

どんな助けでも大歓迎です!

アップデート

一度にプルし、その後関数を使用して一度にアップロードする JSON の行を変更しようとしました - 1000 から 100 まで。

理想的には、各 forEach 配列の反復が前の反復が完了するのを待ってから開始すれば完璧です。

更新 #2

async モジュールをインストールしました。現在、async.eachSeries 関数を使用して、一度に 1 つのドキュメントのアップロードを実行しています。アップロード中のすべてのエラーは消えますが、機能が完了するまでには非常に長い時間がかかります (158,000 ドキュメントの場合、約 9 時間)。私の更新されたループコードはこれで、カウンターが実装されています:

また、一定期間が経過すると、データベースは次のエラーを返します。

(ノード:16168) UnhandledPromiseRejectionWarning: 未処理の promise 拒否 (拒否 ID: -Number-): エラー: データストア操作がタイムアウトしたか、データが一時的に利用できませんでした。

私の関数は時間がかかりすぎているようです... 十分な長さではありません。エラーなしでこれをより速く実行する方法について誰かアドバイスがありますか?