当 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 文件。