问题描述
我正在尝试使用服务器发送的事件从数据库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 (将#修改为@)