Google Firestore 云函数删除字段无报错但未生效问题咨询
问题成因
- 异步操作未等待执行完成:
update()是 Firestore 异步API,返回Promise对象,你的代码没有等待该异步操作执行完成就提前调用了res.send(),HTTP云函数在返回响应后会立即冻结运行环境,未执行完成的删除操作会被直接中断,因此没有实际生效。 - 实例引用不一致:你获取文档时使用的是
admin.firestore()初始化的实例,执行更新时切换到未定义来源的db变量,如果db没有正确赋值为Firestore操作实例,该更新语句本身就不会执行,同时由于你没有捕获该Promise的异常,也不会有报错输出。 - 更新逻辑匹配错误:如果你要删除的是
ar数组中的第一个元素,直接传入field作为字段名无法匹配到文档的顶层字段,Firestore的FieldValue.delete()仅能删除顶层字段或通过字段名.嵌套字段名格式指定的嵌套字段,无法直接通过数组元素值删除数组项,这种场景需要用FieldValue.arrayRemove()方法。
修复参考代码
exports.reserveId = functions.https.onRequest(async (req, res) => { cors(req, res, async ()=> { try { const documentId = "idAvailable" const setReserved = "idReserved" // 统一使用同一个Firestore实例,避免引用错误 const firestore = admin.firestore() const docRef = firestore.collection("Vacancy").doc(documentId) const doc = await docRef.get() const targetField = doc.data().ar[0] console.log("Field " + JSON.stringify(targetField)) // 等待更新操作执行完成,根据实际需求二选一 // 场景1:删除和targetField值同名的顶层字段 await docRef.update({ [targetField]: admin.firestore.FieldValue.delete() }) // 场景2:删除ar数组中的targetField元素,注释上面的更新,取消下面代码的注释 // await docRef.update({ // ar: admin.firestore.FieldValue.arrayRemove(targetField) // }) res.send(targetField) } catch (error) { res.status(500).send(error) } }) });
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

