Javascript FIREBASE警告Can';t在发送邮件后设置邮件头

Javascript FIREBASE警告Can';t在发送邮件后设置邮件头,javascript,node.js,firebase,express,Javascript,Node.js,Firebase,Express,当数据被推送到数据库时,我会使用数据流自动更新我的角度材料数据表 这是我的路由器 router .route("/") .get(function (req, res, err) { // Get a database reference to our posts var db = admin.database(); var ref = db.ref("/"); // Attach an asynchronous callback to read th

当数据被推送到数据库时,我会使用数据流自动更新我的角度材料数据表

这是我的路由器

router
  .route("/")
  .get(function (req, res, err) {

    // Get a database reference to our posts
    var db = admin.database();
    var ref = db.ref("/");

    // Attach an asynchronous callback to read the data at our posts reference
    ref.on("value", function (snapshot) {
      var list = [];
      snapshot.forEach(function (elem) {
        list.push(elem.val());
      })


      res.send(list);

    }, function (errorObject) {
      console.log("The read failed: " + errorObject.code);
    });
  });

router
  .route("/")
  .post(function (req, res, err) {
    console.log(req.body);
    // Get a database reference to our posts
    var db = admin.database();
    var ref = db.ref("/");

    // Attach an asynchronous callback to read the data at our posts reference
    ref.push(
      {
        "text": req.body.text
      }

    );

  });
当我运行我的应用程序时,我会获取所有数据,然后当我尝试将数据发布到数据库时,我会出现以下错误:

FIREBASE WARNING: Exception was thrown by user callback. Error: Can't set headers after they are sent.
当我使用
一次而不是
on
时,我不会得到错误,但由于我需要在数据库的每次更新中获取新数据,我应该使用
on
来获取数据流


那么,如何在不出现此错误的情况下在
上使用

当您连接一个启用了
的侦听器(“值”)
时,它将继续侦听数据。这意味着,如果数据稍后发生更改,它也会触发,此时您已经向客户端发送了一个响应并关闭了套接字

为了防止出现这种情况,您应该使用
一次(“value”)

我还向错误处理程序添加了一个响应

更新

如果要继续向客户端发送更新,则需要保持连接打开。在这种情况下,不应调用
res.send()
(关闭连接),而应调用
res.write()
(保持连接打开)。看


当您连接一个启用了
的侦听器(“值”)
时,它将继续侦听数据。这意味着,如果数据稍后发生更改,它也会触发,此时您已经向客户端发送了一个响应并关闭了套接字

为了防止出现这种情况,您应该使用
一次(“value”)

我还向错误处理程序添加了一个响应

更新

如果要继续向客户端发送更新,则需要保持连接打开。在这种情况下,不应调用
res.send()
(关闭连接),而应调用
res.write()
(保持连接打开)。看


.on绑定一个不会消失的处理程序。一旦绑定了一个离开的处理程序。很明显,您希望后一种解决方案是行之有效的。一个请求不能多次响应,因此只听下一个更改是没有意义的。正如错误试图告诉您的那样,您只能发送一次响应。添加新数据时,once不会向前端发送更新您不能使用http请求执行更新。绑定一个不会消失的处理程序。一旦绑定了一个离开的处理程序。很明显,您希望后一种解决方案是行之有效的。一个请求不能多次响应,因此只听下一个更改是没有意义的。正如错误试图告诉您的那样,您只能发送一次响应。在添加新数据时,once不会向前端发送更新。您不能使用http请求执行此操作。正如我所说,这不会创建数据流。我的意思是,在前端,我有一个可观察的对象,它可以监听我的get http请求。我希望当我在数据库中发布一个数据时,我的可观察对象会自动更新视图。使用once不可能。在写入后调用
send()
关闭连接。要保持连接打开,请使用
write()
。但是一般来说,对于这种类型的方法,考虑使用Web套接字而不是纯HTTP。现在我用写<代码> FialBaseBebug得到这个错误:由用户回调引发异常。TypeError:第一个参数必须是字符串或缓冲区
,我想这意味着您只能编写
res.write(JSON.stringify(list))
,正如我所说,这不会创建数据流。我的意思是,在前端,我有一个可观察的对象,它可以监听我的get http请求。我希望当我在数据库中发布一个数据时,我的可观察对象会自动更新视图。使用once不可能。在写入后调用
send()
关闭连接。要保持连接打开,请使用
write()
。但是一般来说,对于这种类型的方法,考虑使用Web套接字而不是纯HTTP。现在我用写<代码> FialBaseBebug得到这个错误:由用户回调引发异常。TypeError:第一个参数必须是字符串或缓冲区我猜这意味着只能写
res.write(JSON.stringify(list))
router
  .route("/")
  .get(function (req, res, err) {

    // Get a database reference to our posts
    var db = admin.database();
    var ref = db.ref("/");

    // Attach an asynchronous callback to read the data at our posts reference
    ref.once("value", function (snapshot) {
      var list = [];
      snapshot.forEach(function (elem) {
        list.push(elem.val());
      })

      res.send(list);

    }, function (errorObject) {
      console.log("The read failed: " + errorObject.code);
      res.status(500).send(errorObject.code);
    });
  });
router
  .route("/")
  .get(function (req, res, err) {

    // Get a database reference to our posts
    var db = admin.database();
    var ref = db.ref("/");

    // Attach an asynchronous callback to read the data at our posts reference
    ref.on("value", function (snapshot) {
      var list = [];
      snapshot.forEach(function (elem) {
        list.push(elem.val());
      })


      res.write(list);

    }, function (errorObject) {
      console.log("The read failed: " + errorObject.code);
      res.status(500).send(errorObject.code);
    });
  });