I’m implementing a firebase function that takes metadata from a store in firestore, then get all files of that store folder in storage and compares this data with the one stored in the metadata. If some condition applies it sends an email to indicate that theres a possible incident to attend.
It was working just fine. However, since I added the Firebase trigger mail extension it crashed. Now, when I call the doc.data() function in order to get the data from a document, it returns empty, and I can’t get the files count from storage anymore.
This is the code I use atm:
const db = getFirestore();
const bucket = getStorage().bucket();
exports.checkSanity = onSchedule(
{ schedule: "every 1 minutes", memory: "4GiB" },
async (event) => {
const subwayRef = db.collection("subway");
const snapshot = await subwayRef.get();
logger.log("snapshot: ", snapshot);
const docs = [];
snapshot.forEach((doc) => {
docs.push(doc);
logger.log("doc: ", doc);
});
// array of stores to notify
let toNotifyFail = [];
let toNotifySuccess = [];
for (const doc of docs) {
const data = doc.data();
logger.log("data: ", data);
const {
id,
name,
openHour,
closeHour,
status,
notified,
lastTotalCount,
} = data;
const docRef = db.collection("subway").doc(id);
logger.log("[INFO] Showing stores configs");
logger.log(
`${doc.id} => ${data.name}, ${data.openHour}, ${data.closeHour}, ${data.status}, ${data.notified}, ${data.notified_at}, ${data.lastTotalCount}`
);
logger.log("before");
// get last bucket total count
const [files] = await bucket.getFiles({ prefix: `${name}` });
logger.log("after...");
logger.log(`${name} => contains ${files.length}`);
if (lastTotalCount != 0) {
// get current hour
const date = new Date();
if (
true /*date.getHours() >= openHour && date.getHours() < closeHour*/
) {
if (!notified && lastTotalCount == files.length) {
// update store
await docRef.update({
notified: true,
notified_at: date.toString(),
status: "paused",
});
// add to notifications email
toNotifyFail.push(`<li>${name}</li>`);
}
// store back to normal
if (notified && lastTotalCount < files.length) {
// update store
await docRef.update({
notified: false,
notified_at: date.toString(),
status: "capturing",
});
toNotifySuccess.push(`<li>${name}</li>`);
}
}
}
await docRef.update({
lastTotalCount: files.length,
});
}
// notify
if (toNotifyFail.length > 0) {
await db.collection("mail").add({
to: ["***", "****"],
message: {
subject: "Nuevo fallo detectado en subway-counting",
text: "Se ha detectado un nuevo fallo en una o mas tiendas",
html: `Las siguientes tiendas han dejado de enviar datos: <br> <ul>${toNotifyFail.join()}</ul>`,
},
});
}
if (toNotifySuccess.length > 0) {
await db.collection("mail").add({
to: ["***", "***"],
message: {
subject: "Nuevo fix en subway-counting",
text: "Una o mas tiendas han vuelto a funcionar con normalidad",
html: `Las siguientes tiendas han vuelto a enviar datos: <br> <ul>${toNotifySuccess.join()}</ul>`,
},
});
}
}
);
And the error I get from the logger is:
Error: Value for argument "documentPath" is not a valid resource path. Path must be a non-empty string.
at entryFromArgs (/workspace/node_modules/firebase-functions/lib/logger/index.js:130:19)
at Object.error (/workspace/node_modules/firebase-functions/lib/logger/index.js:116:11)
at httpFunc (/workspace/node_modules/firebase-functions/lib/v2/providers/scheduler.js:71:20)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Most surely because I’m not sending any value as prefix to the storage, or the id to set the docs ref, since data is empty as doc.data() is not returning anything.
Any clue on why this is happening now? Any help would be much appreciated!
UPDATE: this is what I get from the logs:
INFO 2023-11-19T05:43:00.503799Z snapshot: QuerySnapshot { _query: CollectionReference { _firestore: Firestore { _settings: [Object], _settingsFrozen: true, _serializer: [Serializer], _projectId: 'photo-capture-11c8e', _databaseId: '(default)', registeredListenersCount: 0, bulkWritersCount: 0, _backoffSettings: [Object], _clientPool: [ClientPool], _gax: [Object] }, _queryOptions: QueryOptions { parentPath: [ResourcePath], collectionId: 'subway', converter: [Object], allDescendants: false, filters: [], fieldOrders: [], startAt: undefined, endAt: undefined, limit: undefined, limitType: undefined, offset: undefined, projection: undefined, kindless: false, requireConsistency: true }, _serializer: Serializer { createReference: [Function (anonymous)], createInteger: [Function (anonymous)], allowUndefined: false }, _allowUndefined: false }, _readTime: Timestamp { _seconds: 1700372580, _nanoseconds: 490801000 }, _size: 5, _materializedDocs: null, _materializedChanges: null, _docs: [Function (anonymous)], _changes: [Function (anonymous)] }
INFO 2023-11-19T05:43:00.504023Z doc: QueryDocumentSnapshot { _fieldsProto: { closeHour: { integerValue: '23', valueType: 'integerValue' }, notified: { booleanValue: false, valueType: 'booleanValue' }, name: { stringValue: 'subway-merced', valueType: 'stringValue' }, openHour: { integerValue: '7', valueType: 'integerValue' }, notified_at: { stringValue: '', valueType: 'stringValue' }, status: { stringValue: 'capturing', valueType: 'stringValue' }, lastTotalCount: { integerValue: '0', valueType: 'integerValue' } }, _ref: DocumentReference { _firestore: Firestore { _settings: [Object], _settingsFrozen: true, _serializer: [Serializer], _projectId: 'photo-capture-11c8e', _databaseId: '(default)', registeredListenersCount: 0, bulkWritersCount: 0, _backoffSettings: [Object], _clientPool: [ClientPool], _gax: [Object] }, _path: QualifiedResourcePath { segments: [Array], projectId: 'photo-capture-11c8e', databaseId: '(default)' }, _converter: { toFirestore: [Function: toFirestore], fromFirestore: [Function: fromFirestore] } }, _serializer: Serializer { createReference: [Function (anonymous)], createInteger: [Function (anonymous)], allowUndefined: false }, _readTime: Timestamp { _seconds: 1700372580, _nanoseconds: 490801000 }, _createTime: Timestamp { _seconds: 1700372192, _nanoseconds: 562519000 }, _updateTime: Timestamp { _seconds: 1700372192, _nanoseconds: 562519000 } }
INFO 2023-11-19T05:43:00.504232Z doc: QueryDocumentSnapshot { _fieldsProto: { closeHour: { integerValue: '19', valueType: 'integerValue' }, notified: { booleanValue: false, valueType: 'booleanValue' }, name: { stringValue: 'subway-tenderini', valueType: 'stringValue' }, openHour: { integerValue: '9', valueType: 'integerValue' }, notified_at: { stringValue: '', valueType: 'stringValue' }, lastTotalCount: { integerValue: '0', valueType: 'integerValue' }, status: { stringValue: 'capturing', valueType: 'stringValue' } }, _ref: DocumentReference { _firestore: Firestore { _settings: [Object], _settingsFrozen: true, _serializer: [Serializer], _projectId: 'photo-capture-11c8e', _databaseId: '(default)', registeredListenersCount: 0, bulkWritersCount: 0, _backoffSettings: [Object], _clientPool: [ClientPool], _gax: [Object] }, _path: QualifiedResourcePath { segments: [Array], projectId: 'photo-capture-11c8e', databaseId: '(default)' }, _converter: { toFirestore: [Function: toFirestore], fromFirestore: [Function: fromFirestore] } }, _serializer: Serializer { createReference: [Function (anonymous)], createInteger: [Function (anonymous)], allowUndefined: false }, _readTime: Timestamp { _seconds: 1700372580, _nanoseconds: 490801000 }, _createTime: Timestamp { _seconds: 1700372408, _nanoseconds: 635977000 }, _updateTime: Timestamp { _seconds: 1700372408, _nanoseconds: 635977000 } }
INFO 2023-11-19T05:43:00.504424Z doc: QueryDocumentSnapshot { _fieldsProto: { closeHour: { integerValue: '20', valueType: 'integerValue' }, notified: { booleanValue: false, valueType: 'booleanValue' }, openHour: { integerValue: '10', valueType: 'integerValue' }, notified_at: { stringValue: '', valueType: 'stringValue' }, ' name': { stringValue: 'subway-mall-del-centro', valueType: 'stringValue' }, lastTotalCount: { integerValue: '0', valueType: 'integerValue' }, status: { stringValue: 'capturing', valueType: 'stringValue' } }, _ref: DocumentReference { _firestore: Firestore { _settings: [Object], _settingsFrozen: true, _serializer: [Serializer], _projectId: 'photo-capture-11c8e', _databaseId: '(default)', registeredListenersCount: 0, bulkWritersCount: 0, _backoffSettings: [Object], _clientPool: [ClientPool], _gax: [Object] }, _path: QualifiedResourcePath { segments: [Array], projectId: 'photo-capture-11c8e', databaseId: '(default)' }, _converter: { toFirestore: [Function: toFirestore], fromFirestore: [Function: fromFirestore] } }, _serializer: Serializer { createReference: [Function (anonymous)], createInteger: [Function (anonymous)], allowUndefined: false }, _readTime: Timestamp { _seconds: 1700372580, _nanoseconds: 490801000 }, _createTime: Timestamp { _seconds: 1700372324, _nanoseconds: 62497000 }, _updateTime: Timestamp { _seconds: 1700372324, _nanoseconds: 62497000 } }
INFO 2023-11-19T05:43:00.504649Z doc: QueryDocumentSnapshot { _fieldsProto: { closeHour: { integerValue: '22', valueType: 'integerValue' }, notified: { booleanValue: false, valueType: 'booleanValue' }, name: { stringValue: 'subway-subcentro', valueType: 'stringValue' }, openHour: { integerValue: '7', valueType: 'integerValue' }, notified_at: { stringValue: '', valueType: 'stringValue' }, status: { stringValue: 'capturing', valueType: 'stringValue' }, lastTotalCount: { integerValue: '0', valueType: 'integerValue' } }, _ref: DocumentReference { _firestore: Firestore { _settings: [Object], _settingsFrozen: true, _serializer: [Serializer], _projectId: 'photo-capture-11c8e', _databaseId: '(default)', registeredListenersCount: 0, bulkWritersCount: 0, _backoffSettings: [Object], _clientPool: [ClientPool], _gax: [Object] }, _path: QualifiedResourcePath { segments: [Array], projectId: 'photo-capture-11c8e', databaseId: '(default)' }, _converter: { toFirestore: [Function: toFirestore], fromFirestore: [Function: fromFirestore] } }, _serializer: Serializer { createReference: [Function (anonymous)], createInteger: [Function (anonymous)], allowUndefined: false }, _readTime: Timestamp { _seconds: 1700372580, _nanoseconds: 490801000 }, _createTime: Timestamp { _seconds: 1700162127, _nanoseconds: 183785000 }, _updateTime: Timestamp { _seconds: 1700163583, _nanoseconds: 355554000 } }
INFO 2023-11-19T05:43:00.504812Z doc: QueryDocumentSnapshot { _fieldsProto: { name: { stringValue: 'subway-los-militares', valueType: 'stringValue' }, lastTotalCount: { integerValue: '0', valueType: 'integerValue' }, notified: { booleanValue: false, valueType: 'booleanValue' }, status: { stringValue: 'capturing', valueType: 'stringValue' }, closeHour: { integerValue: '19', valueType: 'integerValue' }, openHour: { integerValue: '8', valueType: 'integerValue' }, notified_at: { stringValue: '', valueType: 'stringValue' } }, _ref: DocumentReference { _firestore: Firestore { _settings: [Object], _settingsFrozen: true, _serializer: [Serializer], _projectId: 'photo-capture-11c8e', _databaseId: '(default)', registeredListenersCount: 0, bulkWritersCount: 0, _backoffSettings: [Object], _clientPool: [ClientPool], _gax: [Object] }, _path: QualifiedResourcePath { segments: [Array], projectId: 'photo-capture-11c8e', databaseId: '(default)' }, _converter: { toFirestore: [Function: toFirestore], fromFirestore: [Function: fromFirestore] } }, _serializer: Serializer { createReference: [Function (anonymous)], createInteger: [Function (anonymous)], allowUndefined: false }, _readTime: Timestamp { _seconds: 1700372580, _nanoseconds: 490801000 }, _createTime: Timestamp { _seconds: 1700369879, _nanoseconds: 916393000 }, _updateTime: Timestamp { _seconds: 1700370052, _nanoseconds: 698090000 } }
INFO 2023-11-19T05:43:00.505032Z data: