服务器自动关闭并面临“ ERR_STREAM_WRITE_AFTER_END”错误以及每次发送到客户端的数据

问题描述

我正在尝试使用服务器发送的事件从数据库Mysql获取实时数据,并将该值发送到客户端Reactjs。这是代码:

server.js

const mysql = require('mysql');
const app = require('express')()
const fetch = require('node-fetch');

const con = mysql.createConnection({
  host: 'localhost',user: 'root',password: 'root',database: 'databasetest',});
var increment = 0;

app.get('/stream/:abc/:qwe',(request,response) => {
  console.log(`Request url: ${request.url}`);

  var startDate = request.params.abc
  var endDate = request.params.qwe

  request.on('close',() => {
    increment = increment - 1;
    closeConnection(response);
  });

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

  setTimeout(() => {
    var initial_result;
    console.log("The connection number is ",(++increment))
    setInterval(() => {
      con.query('SELECT * FROM status_table where start_time BETWEEN ? and ?',[startDate,endDate],(err,rows) => {
  
        if (err) {
          console.log('error',err.message,err.stack)
        }

        if (JSON.stringify(rows) === JSON.stringify(initial_result)) {

        } else {
          if (Changed(initial_result,rows)) {
              let data = null;
              const url = "http://localhost:8080/data?startTime=" + startDate + "&endTime=" + endDate;
              data = getData(url);

              data.then(function (result) {
              console.log("Data is sent")
              response.write("event: executinghello\n");
              response.write('data: ' + JSON.stringify(result));
              response.write("\n\n");
              eventHistory.push(result);
              response.end()
            })
            
            initial_result = rows;
          }
        }

      })

      function Changed(pre,now) {
        if (pre != now) {
          return true
        } else {
          return false
        }
      }
    },5000);
 },3000);
});

app.listen(4001,() => console.log('SSE app listening on port 4001!'))

async function getData(url) {
  try {
    const response = await fetch(url);
    const json = await response.json();
    return json;
  } catch (error) {
    console.log(error);
    return error;
  }
};

function closeConnection(response) {
  if (!response.finished) {
    response.end();
    console.log('Stopped sending events.');
  }
}

client.js

 this.eventSource = new EventSource("http://localhost:4001/stream/"+startDate+"/"+endDate);
    this.eventSource.addEventListener("executinghello",e => {
      const data = JSON.parse(e.data);
      data.sort((a,b) => parseFloat(b.id) - parseFloat(a.id));
      this.setState({
       isLoaded: true,allData: data,})
});

使用此方法,我可以获取数据,但是几秒钟后,连接将关闭,然后,如果数据正在向数据库发送POST,则会出现以下错误:

Data is sent
events.js:292
      throw er; // Unhandled 'error' event
      ^

Error [ERR_STREAM_WRITE_AFTER_END]: write after end
    at write_ (_http_outgoing.js:629:17)
    at ServerResponse.write (_http_outgoing.js:621:15)
    at Query.<anonymous> (C:\Users\Documents\socket-io-server\app.js:73:24)
    at Query.<anonymous> (C:\Users\Documents\socket-io-server\node_modules\mysql\lib\Connection.js:526:10)
    at Query._callback (C:\Users\Documents\socket-io-server\node_modules\mysql\lib\Connection.js:488:16)
    at Query.Sequence.end (C:\Users\Documents\socket-io-server\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24)
    at Query._handleFinalResultPacket (C:\Users\Documents\socket-io-server\node_modules\mysql\lib\protocol\sequences\Query.js:149:8)
    at Query.EofPacket (C:\Users\Documents\socket-io-server\node_modules\mysql\lib\protocol\sequences\Query.js:133:8)
    at Protocol._parsePacket (C:\Users\Documents\socket-io-server\node_modules\mysql\lib\protocol\Protocol.js:291:23)
    at Parser._parsePacket (C:\Users\Documents\socket-io-server\node_modules\mysql\lib\protocol\Parser.js:433:10)
Emitted 'error' event on ServerResponse instance at:
    at writeAfterEndNT (_http_outgoing.js:684:7)
    at processTicksAndRejections (internal/process/task_queues.js:85:21) {
  code: 'ERR_STREAM_WRITE_AFTER_END'
}

不了解我错过了什么,连接自动关闭。如何克服自动连接end()问题?以及如何摆脱上述错误?而且,仅当数据发生更改时,您能否帮助我将数据从服务器发送到客户端,如果没有更改,则不应通知客户端相同的数据?如何管理连接并在不使用时将其关闭?有人可以帮我解决以上所有问题吗?谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)