質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

解決済

cloud functionsのエラー「Error: Process exited with code 16」が発生する原因は?

Gento
Gento

総合スコア72

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

1回答

0リアクション

0クリップ

3610閲覧

投稿2021/02/01 11:52

編集2021/02/01 13:06

#cloud functions謎のエラーの原因は?

console

Error: Process exited with code 16 at process.on.code (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js:275:22) at process.emit (events.js:198:13) at process.EventEmitter.emit (domain.js:448:20) at process.exit (internal/process/per_thread.js:168:15) at Object.sendCrashResponse (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/logger.js:37:9) at process.on.err (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js:271:22) at process.emit (events.js:198:13) at process.EventEmitter.emit (domain.js:448:20) at emitPromiseRejectionWarnings (internal/process/promises.js:140:18) at process._tickCallback (internal/process/next_tick.js:69:34)

cloud functionsでmonthCountEvents関数をデプロイすると、monthCountEventsが発動するたびにこのようなエラーが発生します。

1

このエラーの原因は何でしょうか?

#何を実現したいか?
Firebase 要素の数をカウントするなら、最初からこの方法でいきましょう!(Cloud Functions)
☝️上記の記事を参考に、Firestoreのドキュメントの数をカウントしています。

users/{userId}/events/{eventId}のドキュメントに変化があった場合、Firestore内のドキュメントフィールド2箇所にカウントを記録します。

typescript

exports.monthCountEvents = functions.region('asia-northeast1').firestore .document('users/{userId}/events/{eventId}') .onWrite((change, context) => {

#該当のコード
ほぼ同じようなコードでも、エラーが**「発生しないパターン」「発生するパターン」**があります。。。😟

##エラーが発生しないパターン

typescript:functions/index.ts

import * as functions from 'firebase-functions'; import * as admin from 'firebase-admin'; admin.initializeApp(); const db = admin.firestore(); // // Start writing Firebase Functions // // https://firebase.google.com/docs/functions/typescript // eventが作成された時にカウントする exports.countEvents = functions.region('asia-northeast1').firestore .document('users/{userId}/events/{eventId}') .onWrite((change, context) => { let periods: boolean; let dayEventCounts: number; if (!change.before.exists) { periods = change.after.get('periods'); dayEventCounts = change.after.get('dayEventCounts'); } else { periods = change.before.get('periods'); dayEventCounts = change.before.get('dayEventCounts'); } const userId = context.params.userId; const FieldValue = admin.firestore.FieldValue; const countsRef = db.collection('users').doc(userId); if (!change.before.exists && !periods) { // 登録時に件数をインクリメント countsRef.update({ eventCount: FieldValue.increment(dayEventCounts) }); return } else if (change.before.exists && !change.after.exists && !periods) { // 削除時に件数をデクリメント countsRef.update({ eventCount: FieldValue.increment(-dayEventCounts) }); return } return; }); exports.monthCountEvents = functions.firestore.document('users/RmSJbxK2A2QNWZbm2nLQwEr7tNw2/events/{eventId}') .onWrite((change) => { let pushMonths: any; let periods: boolean; let dayEventCounts: number; if (!change.before.exists) { pushMonths = change.after.get('pushMonths'); periods = change.after.get('periods'); dayEventCounts = change.after.get('dayEventCounts'); } else { pushMonths = change.before.get('pushMonths'); periods = change.before.get('periods'); dayEventCounts = change.before.get('dayEventCounts'); } const FieldValue = admin.firestore.FieldValue; const countsRef = db.collection(`users/RmSJbxK2A2QNWZbm2nLQwEr7tNw2/counts`).doc(pushMonths); countsRef.get().then((docSnapshot) => { if (!docSnapshot.exists) { countsRef.set({ monthCount: 1, monthDate: pushMonths }); } }); if (!change.before.exists && !periods) { // 登録時に件数をインクリメント return countsRef.update({ monthCount: FieldValue.increment(dayEventCounts) } ); } else if (change.before.exists && !change.after.exists && !periods) { // 削除時に件数をデクリメント return countsRef.update({ monthCount: FieldValue.increment(-dayEventCounts) }); } return })

このmonthCountEventsはなんのエラーもなく発動します。
これはテスト用なので、自分のuidを指定してonWriteがトリガーするようにしています

##エラーが発生するパターン

typescript:functions/index.ts

import * as functions from 'firebase-functions'; import * as admin from 'firebase-admin'; admin.initializeApp(); const db = admin.firestore(); // // Start writing Firebase Functions // // https://firebase.google.com/docs/functions/typescript // eventが作成された時にカウントする exports.countEvents = functions.region('asia-northeast1').firestore .document('users/{userId}/events/{eventId}') .onWrite((change, context) => { let periods: boolean; let dayEventCounts: number; if (!change.before.exists) { periods = change.after.get('periods'); dayEventCounts = change.after.get('dayEventCounts'); } else { periods = change.before.get('periods'); dayEventCounts = change.before.get('dayEventCounts'); } const userId = context.params.userId; const FieldValue = admin.firestore.FieldValue; const countsRef = db.collection('users').doc(userId); if (!change.before.exists && !periods) { // 登録時に件数をインクリメント countsRef.update({ eventCount: FieldValue.increment(dayEventCounts) }); return } else if (change.before.exists && !change.after.exists && !periods) { // 削除時に件数をデクリメント countsRef.update({ eventCount: FieldValue.increment(-dayEventCounts) }); return } return; }); exports.monthCountEvents = functions.region('asia-northeast1').firestore .document('users/{userId}/events/{eventId}') .onWrite((change, context) => { let pushMonths: any; let periods: boolean; let dayEventCounts: number; if (!change.before.exists) { pushMonths = change.after.get('pushMonths'); periods = change.after.get('periods'); dayEventCounts = change.after.get('dayEventCounts'); } else { pushMonths = change.before.get('pushMonths'); periods = change.before.get('periods'); dayEventCounts = change.before.get('dayEventCounts'); } const userId = context.params.userId; const FieldValue = admin.firestore.FieldValue; const monthCountRef = db.collection(`users/${userId}/counts`).doc(pushMonths); monthCountRef.get().then((docSnapshot) => { if (!docSnapshot.exists) { monthCountRef.set({ monthCount: 1, monthDate: pushMonths }); } }); if (!change.before.exists && !periods) { // 登録時に件数をインクリメント return monthCountRef.update({ monthCount: FieldValue.increment(dayEventCounts) }); } else if (change.before.exists && !change.after.exists && !periods) { // 削除時に件数をデクリメント return monthCountRef.update({ monthCount: FieldValue.increment(-dayEventCounts) }); } return; });

このmonthCountEventsは本番用なので、自分のuidではなくワイルドカードを使い、onWriteをトリガーしています。

何が違って、何が原因なのかさっぱりわかりません。。。
どなたかご教授ください!!

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。