Firestore批量删除失败,如何查看Cloud Functions详细日志?
问题描述
我尝试通过Cloud Functions删除Firestore中两个不同集合的文档,编写的Node.js云函数代码如下:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); const { GoogleAuth } = require("googleapis-common"); const { google } = require("googleapis"); const firebase_tools = require("firebase-tools"); const firestore = admin.initializeApp().firestore(); const Buffer = require('buffer'); const PROJECT_ID = process.env.GOOGLE_CLOUD_PROJECT; const PROJECT_NAME = `projects/${PROJECT_ID}`; exports.removeFromShoppingList = functions.region('europe-west1').https.onCall(async(snap, context) => { const db = firestore; const batch = db.batch; const shoppingCartId = snap.shoppingCartId; const shoppingListId = snap.shoppingListId; const productId = snap.productId; try { if (!(context.auth && context.auth.token)) { throw new functions.https.HttpsError( 'permission-denied', 'Must be an administrative user to initiate delete.' ); } const pathShoppingListDetailsCollection = db.collection('shoppingListDetails').doc(shoppingListId) .collection('products').doc(productId); batch.delete(pathShoppingListDetailsCollection); const pathShoppingListsCollection = db.collection('shoppingLists').doc(shoppingCartId) .collection('shoppingListCart').doc(shoppingListId).collection('products').doc(productId); batch.delete(pathShoppingListsCollection); await batch.commit(); } catch(err){ functionCalledToHandleError(); } })
同时在Flutter客户端通过以下代码调用该云函数:
Future<void> removeProductsFromShoppingList({ required String shoppingCartId, required String shoppingListId, required String productId }) async { try { final data = { 'shoppingCartId': shoppingCartId, 'shoppingListId' : shoppingListId, 'productId' : productId }; var delete = functions.httpsCallable('removeFromShoppingList') .call(data); } on FirebaseFunctionsException catch (err){ print('estamos en el FirebaseFunctionsException '); } catch (e) { throw CouldNotDeleteNoteException(); } }
执行batch.delete(pathShoppingListDetailsCollection)时出现错误,在Google Cloud控制台查看日志时,仅能看到textPayload为“删除文档时出错”的信息,无法定位失败原因,请问如何查看Cloud Functions的详细日志?
解决方法
一、查看详细日志的三种方式
- 控制台展开日志详情
- 进入Cloud Functions控制台,找到目标函数
removeFromShoppingList,点击右侧「查看日志」 - 在日志列表中找到提示错误的条目,点击展开,查看
jsonPayload字段,里面包含完整的错误栈、错误代码和具体触发原因
- 进入Cloud Functions控制台,找到目标函数
- 修改云函数错误处理逻辑
当前catch块仅调用了自定义错误处理函数,未输出错误详情,需修改为:
重新部署后,日志会直接打印完整错误栈,明确报错位置和原因catch(err){ console.error('删除文档时出错:', err); // 输出完整错误对象到日志 // 如需将错误返回给客户端,可添加: throw new functions.https.HttpsError('unknown', '删除失败', err.message); } - 使用gcloud命令行查询
打开终端执行以下命令(替换为你的项目ID):
命令会返回JSON格式的完整日志,便于排查深层问题gcloud logging read "resource.type=cloud_function AND resource.labels.function_name=removeFromShoppingList AND resource.labels.region=europe-west1" --project=你的项目ID --format=json
二、代码中的致命错误提示
你的云函数创建批量操作实例的代码存在错误:
const batch = db.batch; // 错误:仅引用了方法,未调用实例化 // 正确写法: const batch = db.batch(); // 调用batch()方法创建批量操作对象
这是导致batch.delete()报错的直接原因——你试图调用未实例化的方法引用,而非批量操作对象的delete方法。修复后批量删除逻辑可正常运行。
内容的提问来源于stack exchange,提问作者jorge
相关产品推荐
相关产品推荐

