当 res.flush() 不起作用时,如何刷新到事件流? (node.js)
How do I flush to event stream, when res.flush() does not work? (node.js)
我用快递和node.js
我一直在努力让加载条工作,我终于想出了使用 res.flush() 因为 res.write() 由于压缩中间件而不起作用 -洁具(据我所知)。
现在,当我将它上传到服务器时,我 运行 遇到了同样的问题。流不会刷新,加载栏只会在 res.end() 上更新。应该连续发送的所有其他进度也在 res.end() 上发送(一次性完成)。
由于 res.flush() 无法像在我的电脑上那样工作,我不知道该怎么做,因为我无法在服务器上进行调试。
我在客户端有一个 EventSource 监听加载栏的更新,但在实时服务器上,唯一的更新是在调用 res.end() 时。
router.get('/statistics/:query/', function(req, res) {
let query = req.params.query;
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
})
//I have absolutely no idea if this is how to transfer progress between two classes
//If this can be improved please let me know
//The goal is to send updates back to the router, while the static class is querying the database
let progressObject : any = new Object();
progressObject.progress = 0;
progressObject.update = function(newProgress) {
//The update function is called within the static class "Statistics" as database query is handled
let isDone = Math.round(newProgress) == 100 ? true : null; //sets isDone to true if progress=100
this.progress = newProgress;
res.write("data: "+JSON.stringify(this)+"\n\n"); //This is the real problem! It works on my PC
res.flush(); //But on the server it is only sent on res.end() in the bottom
}
let barChartLabels = Statistics.getBarChartLabels(progressObject, query);
barChartLabels.then(labels =>{
let responseObject = {
message : labels,
progress : null,
chartTitle : "Stats",
success : true,
};
res.write("data: "+JSON.stringify(responseObject)+"\n\n");
res.end() //All progress data is only flushed here.
}).catch(err=>{
console.log("error!: "+err)
let responseObject = {
message : "Something went wrong when querying the database",
progress : null,
success : false
};
res.write("data: "+JSON.stringify(responseObject)+"\n\n");
res.end()
})
});
最重要的是让它在服务器上运行,但我也很想知道将加载进度发送到路由器的好方法是什么。
在 Steele Parker 的帮助下,我设法解决了问题。
生产服务器在 iis 上运行,我所要做的就是将 reponseBufferLimit=0 设置为默认值 4194304。
可以通过添加
来完成
<handlers>
<add name="iisnode" path="app.js" verb="*" modules="iisnode" responseBufferLimit="0" />
</handlers>
到 web.config 文件。
我用快递和node.js
我一直在努力让加载条工作,我终于想出了使用 res.flush() 因为 res.write() 由于压缩中间件而不起作用 -洁具(据我所知)。
现在,当我将它上传到服务器时,我 运行 遇到了同样的问题。流不会刷新,加载栏只会在 res.end() 上更新。应该连续发送的所有其他进度也在 res.end() 上发送(一次性完成)。 由于 res.flush() 无法像在我的电脑上那样工作,我不知道该怎么做,因为我无法在服务器上进行调试。
我在客户端有一个 EventSource 监听加载栏的更新,但在实时服务器上,唯一的更新是在调用 res.end() 时。
router.get('/statistics/:query/', function(req, res) {
let query = req.params.query;
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
})
//I have absolutely no idea if this is how to transfer progress between two classes
//If this can be improved please let me know
//The goal is to send updates back to the router, while the static class is querying the database
let progressObject : any = new Object();
progressObject.progress = 0;
progressObject.update = function(newProgress) {
//The update function is called within the static class "Statistics" as database query is handled
let isDone = Math.round(newProgress) == 100 ? true : null; //sets isDone to true if progress=100
this.progress = newProgress;
res.write("data: "+JSON.stringify(this)+"\n\n"); //This is the real problem! It works on my PC
res.flush(); //But on the server it is only sent on res.end() in the bottom
}
let barChartLabels = Statistics.getBarChartLabels(progressObject, query);
barChartLabels.then(labels =>{
let responseObject = {
message : labels,
progress : null,
chartTitle : "Stats",
success : true,
};
res.write("data: "+JSON.stringify(responseObject)+"\n\n");
res.end() //All progress data is only flushed here.
}).catch(err=>{
console.log("error!: "+err)
let responseObject = {
message : "Something went wrong when querying the database",
progress : null,
success : false
};
res.write("data: "+JSON.stringify(responseObject)+"\n\n");
res.end()
})
});
最重要的是让它在服务器上运行,但我也很想知道将加载进度发送到路由器的好方法是什么。
在 Steele Parker 的帮助下,我设法解决了问题。
生产服务器在 iis 上运行,我所要做的就是将 reponseBufferLimit=0 设置为默认值 4194304。
可以通过添加
来完成<handlers>
<add name="iisnode" path="app.js" verb="*" modules="iisnode" responseBufferLimit="0" />
</handlers>
到 web.config 文件。