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

时间:2018-08-16 06:09:44

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

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

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

问题 :问题是,当我对后端进行后期调用并完成后,页面会刷新,但由于此原因数据不会显示 错误: [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());
})
})

1 个答案:

答案 0 :(得分:0)

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

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

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

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