События SSE не доходят до клиента, пока не будет вызван res.end () - PullRequest
1 голос
/ 08 мая 2020

Тот же код, что и раньше, но я не знаю, почему он не работает сейчас. Пожалуйста, помогите.

Моя проблема в том, что когда я использую SSE для обмена данными в реальном времени. Объект данных, который должен быть отправлено на res.write (data:${JSON.stringify(dataObject)}\n\n) не отправляется до тех пор, пока не будет вызвана res.end () и все данные потоков событий отправляются сразу.

response.writeHead(200, {
    Connection: "keep-alive",
    "Content-Type": "text/event-stream",
    "Cache-Control": "no-cache",
    "Access-Control-Allow-Origin": '*',
    'Content-Encoding':'identity' // this with and without this
});

let syncher= setInterval(() => { 
    if(response.finished){ // If response ended the  interval is cleared
        clearInterval(syncher);
        return;
    }else{
        let dataToSend = getEventData(user,event);
        if(! dataToSend ){
            response.write('data:{close:true}');
            clearInterval(syncher);
            return;
        }
        response.write(`data:${JSON.stringify(dataToSend)}\n\n`);
        response.flushHeaders(); // Also tried with response.flush()
        if(dataToSend.close){
            delEventData(user,event);
            response.end();
        }
    }
}, 500);

Приведенный выше код находится на стороне сервера здесь также есть близкий слушатель, чтобы закрыть соединение

const ev = new EventSource(conf.apiUrl+'/getStatus/'+ (userData.id || '') );
  let data = '';
  ev.onmessage = eventData=>{
    data = JSON.parse(eventData.data);
    if(!data){
      setState('progress '+data.completedSoFar)
      return;
    }
    if(!data.close){

    }else{
      if(data.success){
        console.log('Done Successfully')
      ev.close();
    }
  }

Это мой код на стороне клиента

Я не знаю, почему слушатель событий не получает поток данных, пока я искал inte rnet об этой проблеме, я обнаружил, что эта проблема возникает только при использовании промежуточного программного обеспечения сжатия. Я не использую промежуточное программное обеспечение сжатия в моем приложении. Я использую nodejs v11.4.0. Я предполагаю, что когда я делаю запрос источника событий chrome, по умолчанию добавляется кодировка gzip, а узел использует это, чтобы установить заголовок кодировки ответа как gzip, я пытался удалить и заменить его, но не работал, что вызывает эту проблему?

Вот мои заголовки запроса и ответа для запроса eventSource

Извините за мою грамматику, если я сделал какие-либо ошибки.

Спасибо за помощь. Ура!

1 Ответ

0 голосов
/ 14 мая 2020

После долгой отладки и исследований. Проблема оказалась в webpack-dev-сервере, который сжал мои ответы. Для получения дополнительной информации см. https://github.com/facebook/create-react-app/issues/966

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