如何监听特定的 Firestore 文档创建事件?

Thi*_*man 6 firebase google-cloud-firestore

我正在实现一个命令/响应模式,其中用户通过add使用他自己的 userId 下的有效负载调用来写入命令集合,然后从类似的响应路径中获取数据。

但是下面的代码不起作用,因为 onSnapshot 无法侦听尚未创建的文档command.id/responses/{userId}/register集合中的文档)。使用 onCreate 处理程序很容易解决这个问题,该处理程序适用于云函数,但似乎不适用于 JS firebase 客户端 API。

这是使用redux-firestore和我的一些应用程序助手功能,但您会明白的。命令和响应文档结构使用类似于FSA 的{ payload, error}

云功能

export const register = functions.firestore
  .document("commands/{userId}/register/{commandId}")
  .onCreate(async event => {
    const payload = event.data.get("payload");
    const { userId, commandId } = event.params;
    const response = db.document(`responses/${userId}/register/${commandId}`)

    // possibly something bad will happen
    try {

      // do something with payload...

      return response.set({
        payload: "ok" // or pass relevant response data
      })
    } catch(err) {
      return response.set({
        error: true
        payload: error
      })
    }
  });
Run Code Online (Sandbox Code Playgroud)

客户

export async function register(fs: any, userId: string) {
  try {

    // issue a new command
    const command = await fs.add(
      { collection: `commands/${userId}/register` },
      { payload: fs.firestore.FieldValue.serverTimestamp() }
    );

    // wait for the response to be created
    fs.onSnapshot(
      { collection: `responses/${userId}/register`, doc: command.id },
      function onNext(doc) {
        const {error, payload} = doc.data()

        if (error) {
          return notify.error({ title: 'Failed to register', message: payload.message });
        }
        notify.json(payload);
      },
      function onError(err) {
        notify.error(err);
      }
    );
  } catch (err) {
    notify.error(err);
  }
}
Run Code Online (Sandbox Code Playgroud)

Web 客户端没有 onCreate 这样的东西吗?

我能想到的唯一可扩展的解决方案是将响应数据作为子项存储在命令文档中,但我认为它没有那么好,因为我怀疑你不能把权限设置得那么严格。

我希望用户只能写入命令,并且只能从响应路径中读取。如果我将响应作为命令的子项,我认为这是不可能的吗?

我想知道我是否没有忽略一些 API ......