Node.js 如何使用firestore和express.js创建onSnapshot侦听器

Node.js 如何使用firestore和express.js创建onSnapshot侦听器,node.js,firebase,express,google-cloud-firestore,Node.js,Firebase,Express,Google Cloud Firestore,我试图通过向文档添加onSnapshot侦听器来设置实时功能。当我调用api时,它工作得很好,但是每当我修改数据时,我都会遇到一个错误 错误[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头 我知道当您多次调用res.send(something)时会发生这种错误,但这里的情况并非如此。同时,我检查了firebase节点模块,发现reference.js文件调用了一个onNext函数,该函数可能会触发错误。我真的不知道这里发生了什么,但我真的很感谢你的帮助 附加

我试图通过向文档添加onSnapshot侦听器来设置实时功能。当我调用api时,它工作得很好,但是每当我修改数据时,我都会遇到一个错误

错误[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头

我知道当您多次调用
res.send(something)
时会发生这种错误,但这里的情况并非如此。同时,我检查了firebase节点模块,发现reference.js文件调用了一个
onNext
函数,该函数可能会触发错误。我真的不知道这里发生了什么,但我真的很感谢你的帮助

附加一个持久侦听器,该侦听器将为文档的每次更改不断调用。这就是
send()
多次被调用的原因。Express不允许这样做,因为它必须通过HTTP连接一次发送整个响应

相反,您应该使用来一次性获取数据,如中所示。这里不需要一个持久的侦听器

      const ref = db
        .collection("companies")
        .doc(company)
        .collection("operations")
        .doc("jobs")

      ref.get()
      .then(docSnapshot=> {
        res.status(200).send(docSnapshot.data());
      })
      .catch(err => {
        res.status(500).send(err)
      });
如果您实际上试图通过HTTP连接向客户机发送多个文档更新,那么您必须考虑发送响应,并确保您的服务器和客户机框架都可以使用HTTP协议细节。这可能会带来更多麻烦(在这种情况下,您可能应该让客户端直接使用Firestore SDK)。

附加了一个持久侦听器,该侦听器将在每次更改文档时不断被调用。这就是
send()
多次被调用的原因。Express不允许这样做,因为它必须通过HTTP连接一次发送整个响应

相反,您应该使用来一次性获取数据,如中所示。这里不需要一个持久的侦听器

      const ref = db
        .collection("companies")
        .doc(company)
        .collection("operations")
        .doc("jobs")

      ref.get()
      .then(docSnapshot=> {
        res.status(200).send(docSnapshot.data());
      })
      .catch(err => {
        res.status(500).send(err)
      });
如果您实际上试图通过HTTP连接向客户机发送多个文档更新,那么您必须考虑发送响应,并确保您的服务器和客户机框架都可以使用HTTP协议细节。这可能会带来更多麻烦(在这种情况下,您可能应该让客户端直接使用Firestore SDK)