Firestore Functions批量写入遇阻:用户创建时同步餐厅关联数据求助
问题分析与修复
需求
每当新用户创建时,获取其关联餐厅列表,将这些餐厅写入restaurants集合:为每个餐厅创建以名称命名的文档,并在文档中存入该用户的其他关联餐厅,以此实现餐厅间的关联关系查询。
报错信息
FirebaseError: Type does not match the expected instance. Did you pass a reference from a different Firestore SDK?
问题根源
你混用了Firebase客户端SDK(从@firebase/firestore导入的doc、writeBatch)和Firebase Admin SDK(admin.firestore()实例)。这两个SDK的API实例不兼容,导致批量写入时类型不匹配。
修复方案
统一使用Admin SDK提供的批量写入和文档引用方法,不要导入客户端SDK的相关API。同时优化逻辑:原代码每次循环单独写入单个关联餐厅,会导致同一文档多次set,效率低下,建议直接将所有关联餐厅作为数组一次性写入。
修正后的代码
import * as functions from 'firebase-functions'; import * as admin from 'firebase-admin'; import { credentials, privateDatabaseURL } from './config/firebase'; admin.initializeApp({ credential: admin.credential.cert({ privateKey: credentials.private_key, projectId: credentials.project_id, clientEmail: credentials.client_email, }), databaseURL: privateDatabaseURL, }); exports.writeToFirestore = functions.firestore .document('users/{user_name}') .onWrite(async (change, context) => { const data = change.after.data(); if (!data || !data.restaurants?.length) { return null; } const db = admin.firestore(); const batch = db.batch(); // 使用Admin SDK的batch方法 const restaurants = data.restaurants; for (const rest of restaurants) { // 过滤当前餐厅,得到其他关联餐厅 const relatedRestaurants = restaurants.filter(r => r !== rest); const restRef = db.collection('restaurants').doc(rest); // 使用Admin SDK的文档引用方式 // 一次性写入所有关联餐厅数组 batch.set(restRef, { restaurants: relatedRestaurants }, { merge: true }); } return batch.commit(); });
关键修改点
- 移除
@firebase/firestore的导入,全部使用admin.firestore()提供的API:db.batch()、db.collection('restaurants').doc(rest) - 优化循环逻辑:通过
filter直接获取当前餐厅的所有关联餐厅,避免嵌套循环,减少批量操作的次数 - 增加空值判断:检查
data.restaurants是否存在且有长度,避免无效循环
内容的提问来源于stack exchange,提问作者rbjakab
相关产品推荐
相关产品推荐

