我已经研究了几个小时,发现了一些奇怪的东西。为小型应用程序使用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());
})
})
答案 0 :(得分:0)
Firebase的on("value"
监听器将触发:
由于您正在将响应中的数据发送给#1中的客户端,因此响应将在#2发生时关闭/完成。
使用once("value"
侦听器不会发生此问题,因为once()
会在#1之后删除侦听器。