Expressjs Firebase React Redux Не удается установить заголовки после их отправки клиенту

Я исследую эту проблему уже несколько часов и обнаружил что-то странное. Используя 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 и once и почему on может отправлять несколько ответов. Если у вас все еще есть проблема с использованием once, отредактируйте свой вопрос, чтобы объяснить, в чем именно заключается эта проблема.

Frank van Puffelen 16.08.2018 10:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
69
1

Ответы 1

Слушатель on("value" для Firebase сработает:

  1. сразу с текущим значением данных,
  2. и позже также будет срабатывать при изменении данных.

Поскольку вы отправляете данные в ответ клиенту в №1, ответ будет закрыт / завершен к моменту №2.

При использовании слушателя once("value" этой проблемы не возникает, поскольку once() удаляет слушателя после # 1.

Привет, Фрэнк, я ценю твой ответ. Я потратил больше времени, пытаясь написать код таким образом, чтобы я мог использовать прослушиватель .on ("значение", но поскольку он отправляет несколько ответов, я не могу найти, как остановить хотя бы один ответ, поэтому что это не ошибка. Это единственный способ написать .on ("значение", или я могу внести здесь изменения? app.get ('/ all', (req, res, next) => { db.notes.on ('значение', снимок => {return res.send (snapshot.val ());})})

Chris Simmons 16.08.2018 15:14

Зачем нужно использовать on()? Что он делает из того, что вам нужно, чего не делает once()?

Frank van Puffelen 16.08.2018 21:58

Другие вопросы по теме