【问题标题】:Expressjs Firebase React Redux Cannot set headers after they are sent to the clientExpressjs Firebase React Redux 在将标头发送到客户端后无法设置标头
【发布时间】:2019-01-23 00:48:13
【问题描述】:

我已经研究这个问题几个小时了,发现了一些奇怪的东西。使用 ExpressJS、Firebase 和 React 的小应用程序,需要通过 Express Backend 调用 Firebase 数据库,我还需要通过 Express Backend 发出 post 请求将数据存储在数据库中。

功能:我向后端发出 post 请求以将数据添加到数据库。由于 Firebase 是实时数据库,因此数据会立即反映在页面上。

问题:问题是,当我对后端进行 post 调用并完成时,页面会刷新,但数据不会因此而显示 错误:[ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头

/**
 * Add new note to Firebase
* Real-Time Database
*/
app.post('/addNote', (req, res)=> {
var title = req.body.note.title;
var body  = req.body.note.body;
var userId= req.body.note.uid;

db.notes.push({
    title: title,
    body: body,
    uid: userId
})
res.send("Success")
})

app.get('/all', (req, res, next)=> {
 db.notes.on('value', snapshot => {
       return res.send(snapshot.val());
})
})

可能的解决方案:我发现使用下面的代码,我可以发出一个帖子请求,手动刷新页面,然后数据将反映没有标题错误。我正在尝试编写正确的功能,但似乎无法弄清楚代码在哪里使用 db.notes.on 发送多个响应,因为我只发送一次 res.send。明显的区别是(.on 立即侦听和更新,而 .once 需要手动刷新)

/**
 * Add new note to Firebase
* Real-Time Database
*/
app.post('/addNote', (req, res)=> {
var title = req.body.note.title;
var body  = req.body.note.body;
var userId= req.body.note.uid;

db.notes.push({
    title: title,
    body: body,
    uid: userId
})
res.send("Success")
})

app.get('/all', (req, res, next)=> {
 db.notes.once('value', snapshot => {
       return res.send(snapshot.val());
})
})

【问题讨论】:

  • 我在下面写了一个快速回答来解释ononce 之间的区别,以及为什么on 可能会发送多个响应。如果您在使用 once 时仍然遇到问题,请编辑您的问题以解释该问题到底是什么。

标签: node.js reactjs firebase express firebase-realtime-database


【解决方案1】:

将触发 Firebase 的 on("value" 侦听器:

  1. 直接使用数据的当前值,
  2. 稍后也会在数据更改时触发。

由于您在 #1 中将响应中的数据发送给客户端,因此响应将在 #2 发生时关闭/完成。

通过使用once("value" 侦听器不会发生此问题,因为once() 在#1 之后删除了侦听器。

【讨论】:

  • 嘿弗兰克,感谢您的回复。我花了更多时间尝试以允许我使用 .on("value" 侦听器的方式编写代码,但由于它发送多个响应,我似乎无法找到如何停止至少一个响应所以它不会出错。这是编写 .on("value" 的唯一方法,还是我可以在这里进行更改?app.get('/all', (req, res, next)=> { db.notes.on('value', snapshot => { return res.send(snapshot.val()); }) })
  • 为什么需要使用on()?你需要它做什么,once() 也不做?
猜你喜欢
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2021-04-05
  • 2021-06-18
  • 2022-01-14
  • 2021-04-07
相关资源
最近更新 更多