繁体   English   中英

Expressjs Firebase React Redux发送到客户端后无法设置标头

[英]Expressjs Firebase React Redux Cannot set headers after they are sent to the client

我已经研究这个问题了几个小时,发现有些奇怪。 为小型应用程序使用ExpressJS,Firebase和React,并且需要通过Express Backend调用Firebase数据库,我还需要发出发布请求以通过Express Backend将数据存储在数据库中。

功能 :我向后端发出发布请求,以将数据添加到数据库。 由于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());
})
})

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

  1. 立即获取数据的当前值,
  2. 然后在数据更改时也会触发。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM