Firestoreデータベースに通貨の詳細を追加するプロジェクトがあり、私のプロジェクトではionic 3
コレクションに新しいドキュメントを追加するたびに、トリガー関数onCreate()が実行され、「updated」という名前のドキュメントが更新されます。
ただし、トリガー関数は常にエラーを表示します。
Error: Invalid use of type "undefined" as a Firestore argument.
at Object.exports.customObjectError.val [as customObjectError] (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/validate.js:164:14)
at Function.encodeValue (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/document.js:808:20)
at Function.encodeFields (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/document.js:678:36)
at Function.fromObject (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/document.js:218:55)
at WriteBatch.set (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/write-batch.js:291:39)
at DocumentReference.set (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/reference.js:419:8)
at Object.<anonymous> (/user_code/lib/index.js:28:10)
at next (native)
at /user_code/lib/index.js:7:71
at __awaiter (/user_code/lib/index.js:3:12)
助けてください。
私はそれに多くの時間を費やしました。
コードは次のとおりです。
import * as functions from 'firebase-functions';
const admin = require('firebase-admin');
admin.initializeApp();
exports.createCurrency = functions.firestore
.document('Exchange/{ExchangeId}')
.onCreate( async (snap, context) => {
const id: string = snap.data().id;
const branchName: string = snap.data().branchName;
const currencyName: string = snap.data().currencyName;
const buyingRate : string = snap.data().buyingRate;
const sellingRate : string = snap.data().sellingRate;
const newUser= admin.
firestore()
.doc(`Exchange/updated`)
.set({
id : id,
branchName : branchName,
currencyName : currencyName,
sellingRate : sellingRate,
buyingRate :buyingRate
});
return newUser;
});
エラーメッセージは次のとおりです。
Invalid use of type "undefined" as a Firestore argument.
スタックトレースで、DocumentReferenceのオブジェクトでset()を呼び出すと、これが発生することがわかります。オブジェクトに渡す値の1つが未定義であることがわかります。渡す値のそれぞれをチェックし、それらのすべてに実際の値があることを確認します。
.set({
id : id,
branchName : branchName,
currencyName : currencyName,
sellingRate : sellingRate,
buyingRate :buyingRate
});
エラーメッセージからそれがどれであるかを知ることは不可能であるため、それらをすべて印刷して、それらのそれぞれをチェックするために何かをする必要があります。
オブジェクトを設定しても、オブジェクトのフィールドの1つが未定義の場合、このエラーが発生します。
問題は、console.logを使用してオブジェクトを表示すると、未定義の変数が表示されないため、トレースが困難なことです。
Console.logの代わりに次を使用して、問題の原因となっている要素を見つけます。
const util = require('util');
console.log(util.inspect(myObject, {showHidden: false, depth: null}));
これにより、次のような出力が得られます。
{ Origin: 'AMS',
destination: undefined,
duration: 94,
carrier: 'KL',
flight_number: '2977',
departure: '2019-06-11T15:34:00',
arrival: '2019-06-11T17:08:00',
type: 'flight' }