Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Cloud Firestore未在通配符中触发onWrite_Javascript_Node.js_Firebase_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Javascript Cloud Firestore未在通配符中触发onWrite

Javascript Cloud Firestore未在通配符中触发onWrite,javascript,node.js,firebase,google-cloud-firestore,google-cloud-functions,Javascript,Node.js,Firebase,Google Cloud Firestore,Google Cloud Functions,我正在尝试编写一个加总函数来更新通配符中文档嵌套对象的值更改的一些详细信息 exports.createAccessDetails = functions.firestore.document('classrooms/{classId}/access/{accessType}').onWrite((snap, context) => { // const data = snap.data(); const { classId, accessType } = context.para

我正在尝试编写一个加总函数来更新通配符中文档嵌套对象的值更改的一些详细信息

exports.createAccessDetails = functions.firestore.document('classrooms/{classId}/access/{accessType}').onWrite((snap, context) => {
  // const data = snap.data();
  const { classId, accessType } = context.params;
  console.log(snap);
  console.log(classId, accessType);
  return null;
});
然后像单击按钮一样更新对象

function setAccess() {
  const date = Date.now();
  Firebase.firestore.collection('classrooms')
    .doc('1570776211111').update({
      [`access.writeAccess.${date}`]: true
    });
}

我做错了什么?为什么函数没有触发?

更新操作将不会触发云函数。因为您为名为access的子集合编写了触发函数,并且正在对名为教室的根集合进行升级。因此,上述编写的触发函数将仅为名为access的子集合而不是根集合触发集合名为“教室”。希望这将对您有所帮助。

从您上面的评论来看,您似乎想编写(更新)一份
教室
集合的文档。更准确地说,更新Map类型的
access
字段(有关Firestore类型,请参阅)

因此,当您更新此文档时,您的云函数将被触发,为了获得
access
映射的值,您将调用
snap.data().access

exports.createAccessDetails = functions.firestore.document('classrooms/{classId}').onWrite((snap, context) => {
  const data = snap.data();

  const accessMap = snap.data().access;
  const writeAccessMap = accessMap.writeAccess

  //........

  return null;
});

更新以下评论:

我不完全了解您的确切业务需求(特别是我看到您提到writeAccess和readAccess),但您可以采用以下方法:

对于每个
教室
文档,您创建两个子集合:
writeAccess
readAccess
。每次要保存access时,都要在其中一个集合中编写一个新文档

然后,您可以查询子集合以查找给定id具有读写权限的文档。然后从这些查询返回的QueryDocumentSnapshot中,您可以找到父文档(通过
ref
属性)


但是,这意味着您将有一个额外的读取,以从查询结果中获取课堂详细信息到
writeAccess
readAccess
集合。

有什么方法可以实现这一点吗?侦听名为access的子集合中的更改?如果名为access的子集合中有任何更改,将触发您编写的相同函数。您可以提供有关您正试图实现的更改的更多详细信息。正如pepe在他的回答中所解释的,您更新到
集合('questions').doc('157077621111')
,但您的云功能被定义为在写入
集合('questions').doc('157076211111').collection('access').doc('xyz')
时触发。那么你到底想更新吗?在集合
教室
或教室的
访问
子集合中?因此,
教室
有一个巨大的对象,我在其中更新一个键
访问
,该键有另一个名为
写访问
的键或另一种类型,具有不同的数据。目前,我并没有将
access
创建为一个不同的集合,而是将其作为集合
的对象来推送。现在,从Pepe的评论中,我了解到如果我必须倾听
access/{accessType}
对象的变化,我必须使
access
成为
classes
的子类,对吗?如果是这样,我也必须重写我的查询?当前基于
firestore.collection('questions')。where(
access.readAccess.${id}
,'==',true)
?是的,我可以这样做。我最想听到的只是更新访问字段。我不这样做的原因不是每次在
{classId}
中更改某些内容时都触发此函数。如果我更改文档中的任何其他id,它将触发该函数。因此,我认为创建
access
的子集合并听取
access
子集合文档中的更改是明智的。这提醒了我,这算不算多读一次文件?也是最后一个问题,我可能需要重写查询以获取我的
claasrooms
数据。@subwendukundu这对您来说仍然是个问题吗?