Ошибка: не удается установить заголовки после их отправки SSR React + Node

Я пытаюсь обновить этот документ на firebase, он работает впервые, но после этого выдает эту ошибку:

Error: Can't set headers after they are sent

Это кнопка, которая переключает значение:

getActionButtons = () => {
    if (this.state.stepIndex > 2){
      return (<ActionButtons>
        <ActionButton label = {this.state.userType === 'Rider' ? this.state.available ? 'Found a carpool?' : 'look for carpool' : this.state.available ? 'Car is Full?' : 'Available for carpool'} primary = {!this.state.available} secondary = {this.state.available} onClick = {() => {
         console.info("eventId: ", this.props.eventId.event)
          console.info("userId: ", firebase.auth().currentUser.uid)
          // firebase.database().ref('/' + this.props.eventId.event + '/posts/' + firebase.auth().currentUser.uid).transaction((post => {
          //   if (post) {
          //     if (post.available) {
          //       post.available = !post.available
          //     } else {
          //       post.available = this.state.available
          //     }
          //   }
          //   return post;
          // }))
          firebase.database().ref('/' + this.props.eventId.event + '/posts/' + firebase.auth().currentUser.uid + '/available').set(!this.state.available)
          this.setState({
            available: !this.state.available
          });
          this.props.update();
        }}/>
      </ActionButtons>)
    }
  }

Код сервера:

const activeRoute = routes.find(route => matchPath(req.url, route)) || {}
const isEventPage = activeRoute.name === "carpoolingPage"


app.get("*", (req, res, next) => {
if (isEventPage) {
    if (req.params[0]) {
      let eventRef = firebase.database().ref(req.params[0])
      eventRef.on("value", (snapshot) => {
        const event = snapshot.val()
        // console.info("event: ", event)
        if (!event)
          res.redirect("/eventnotfound")
        else {
          const { title, location, description } = event
          const preloadedState = { currentEvent: event }
          const store = configureStore(preloadedState)
          const markup = generateMarkup(store)
          res.send(HTML({
            title: `Carpooling to ${ title }`,
            markup, styleTags,
            preloadedState,
            ogTitle: `Carpooling to ${ title }`,
            ogDescription: `Find people to carpool with to ${ title }. Choose to ride or drive to ${ location } ${ description === null ? '' : `Event Description: ${ description }`}`
          }))
        }
      })
    }
  }
  else {
    const store = configureStore()
    const markup = generateMarkup(store)
    res.send(HTML({ markup, styleTags }))
  }
})

Я использую SSR с Node и React, а экспресс-сервер использует только cors ().

К вашему сведению, он правильно переключает значение на firebase, проблема заключается в том, что сервер выходит с указанной выше ошибкой, из-за чего код, который следует за ним, не запускается.

Кстати, я пытался использовать транзакции firebase и пытался удалить код после строки firebase, но он дает ту же ошибку.

Я следил за всеми подобными вопросами о переполнении стека, но это не соответствует моей проблеме.

Ошибка точно из кода Express.js. Вы можете поделиться кодом этого маршрута?

Akhil P 10.07.2018 14:30

Вы бы проверили это сейчас?

BaHaa Jr. 10.07.2018 14:35

У вас есть другие вызовы API?

Akhil P 10.07.2018 14:42

Можете ли вы проверить ошибку один раз. И посмотрите, в какой строке код ломается?

Akhil P 10.07.2018 14:42

нет только это ..

BaHaa Jr. 10.07.2018 14:42

ломается после обновления чего-то на firebase

BaHaa Jr. 10.07.2018 14:43

Я не знаю огневую базу. Но я уверен, что eventRef.on("value", ...) встречается более одного раза. И вашему res.redirect или res.send звонят более одного раза. В экспрессе, если вы ответили один раз, вы не сможете ответить снова. Надеюсь, это решит вашу проблему.

Akhil P 10.07.2018 14:51

Братан Эта подсказка мне помогла. Я заменил ее однажды, не могли бы вы вставить ее в качестве ответа, чтобы отдать должное. Подпишу как правильный ответ.

BaHaa Jr. 10.07.2018 14:59

Отлично. Я добавил это как ответ

Akhil P 10.07.2018 15:03
Стоит ли изучать 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
9
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я уверен, что eventRef.on("value", ...) встречается более одного раза. И вашему res.redirect или res.send звонят более одного раза. В экспрессе, если вы ответили один раз, вы не сможете ответить снова. Надеюсь, это решит вашу проблему.

Сделайте evetRef.on на eventRef.once. Это решит вашу проблему.

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