Я исследую эту проблему уже несколько часов и обнаружил что-то странное. Используя ExpressJS, Firebase и React для небольшого приложения, и мне нужно вызвать базу данных Firebase через Express Backend, и мне также нужно сделать почтовые запросы для хранения данных в базе данных через 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());
})
})





Слушатель on("value" для Firebase сработает:
Поскольку вы отправляете данные в ответ клиенту в №1, ответ будет закрыт / завершен к моменту №2.
При использовании слушателя once("value" этой проблемы не возникает, поскольку once() удаляет слушателя после # 1.
Привет, Фрэнк, я ценю твой ответ. Я потратил больше времени, пытаясь написать код таким образом, чтобы я мог использовать прослушиватель .on ("значение", но поскольку он отправляет несколько ответов, я не могу найти, как остановить хотя бы один ответ, поэтому что это не ошибка. Это единственный способ написать .on ("значение", или я могу внести здесь изменения? app.get ('/ all', (req, res, next) => { db.notes.on ('значение', снимок => {return res.send (snapshot.val ());})})
Зачем нужно использовать on()? Что он делает из того, что вам нужно, чего не делает once()?
Ниже я написал быстрый ответ, чтобы объяснить разницу между
onиonceи почемуonможет отправлять несколько ответов. Если у вас все еще есть проблема с использованиемonce, отредактируйте свой вопрос, чтобы объяснить, в чем именно заключается эта проблема.