Невозможно создать прослушиватель базы данных и одновременно обновить ее.(используя References.on и References.put) - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь отобразить список комментариев на моей странице реакции.Для этого я настроил сервер NodeJS, который загружает данные из Firebase и передает их в React.Я могу заставить его загрузить список комментариев и отобразить их, но когда я пытаюсь добавить комментарий, происходит сбой сервера со следующей ошибкой:

@ firebase / database: FIREBASE WARNING: Ошибка[ERR_HTTP_HEADERS_SENT]: Невозможно установить заголовки после их отправки клиенту

Это потому, что я использую:

firebase.database().ref('my-path').on("value", ...)

Однако, если я используюfirebase.database().ref('my-path').once("value", ...) тогда я теряю возможность обновлять комментарии, как только публикуется новый комментарий.Можно ли подключить прослушиватель к базе данных и по-прежнему обновлять содержимое этой базы данных?

Вот мой код NodeJS:

app.get("/comments/:id", (req, res) => {
    const itemsRef = firebase.database().ref(`comments/${req.params.id}`);
    itemsRef.on('value', (snapshot) => {
        let comments = snapshot.val();
        return res.status(200).json(comments);
    })
})

app.post("/comments/:id", (req, res) => {
    const itemsRef = firebase.database().ref(`comments/${req.params.id}`);
    itemsRef.push(req.body);
})

Ошибкапроисходит после вызова почтового запроса.

1 Ответ

0 голосов
/ 24 сентября 2019

Вы отправляете ответ клиенту с помощью:

res.status(200).json(comments)

Это устанавливает как минимум два заголовка (статус и тип ответа), а затем отправляет ответ.В следующий раз, когда вы получите обновление из базы данных, этот код снова запускается и снова пытается отправить два заголовка.Но в HTTP все заголовки должны находиться перед основной частью ответа.Таким образом, во второй раз, когда этот код выполняется, он выдает ошибку.

Если вы хотите продолжать отправлять больше данных клиенту, вам нужно будет использовать более примитивные методы объекта ответа, чтобы предотвратить отправку заголовков, илидругие незаконные данные.Хотя это возможно, это более сложно, чем вы думаете, так как клиент должен обрабатывать этот поток ответов, чего большинство клиентов не будут делать.

Я бы настоятельно рекомендовал взглянуть на альтернативу Дуга, а именно просто использоватьБаза данных Firebase Realtime от клиента напрямую.Таким образом, вы можете использовать имеющийся у него клиентский SDK, который обрабатывает это (и многие другие сложности) за кулисами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...