Ste*_*ich 5 javascript node.js express server-sent-events
我使用express.js设置了REST服务器。现在,我想向该服务器添加sse。实现此 sse程序包后,出现错误。我知道我收到此错误,何时尝试使用res.send两次,但我没有。
ERROR: Error: Can't set headers after they are sent.                                            
    at ServerResponse.OutgoingMessage.setHeader (http.js:690:11)                            
    at ServerResponse.header (/home/root/node_modules/express/lib/response.js:718:10)         
    at ServerResponse.send (/home/root/node_modules/express/lib/response.js:163:12)            
    at app.get.str (/home/root/.node_app_slot/main.js:1330:25)                                 
    at Layer.handle [as handle_request] (/home/root/node_modules/express/lib/router/layer.js:95:5)    
    at next (/home/root/node_modules/express/lib/router/route.js:131:13)                       
    at sse (/home/root/node_modules/server-sent-events/index.js:35:2)                          
    at Layer.handle [as handle_request] (/home/root/node_modules/express/lib/router/layer.js:95:5)  
    at next (/home/root/node_modules/express/lib/router/route.js:131:13)                          
    at Route.dispatch (/home/root/node_modules/express/lib/router/route.js:112:3)
是否有可能我无法在sse函数中使用express方法?例如:
app.get('/events', sse, function(req, res) {
    res.send('...');
});
Joh*_*alt 25
我不同意使用 Socket.IO 来实现基本的服务器发送事件。浏览器 API 非常简单,在 Express 中的实现只需要对正常响应路由进行一些更改:
app.get('/streaming', (req, res) => {
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Connection', 'keep-alive');
    res.flushHeaders(); // flush the headers to establish SSE with client
    let counter = 0;
    let interValID = setInterval(() => {
        counter++;
        if (counter >= 10) {
            clearInterval(interValID);
            res.end(); // terminates SSE session
            return;
        }
        res.write(`data: ${JSON.stringify({num: counter})}\n\n`); // res.write() instead of res.send()
    }, 1000);
    // If client closes connection, stop sending events
    res.on('close', () => {
        console.log('client dropped me');
        clearInterval(interValID);
        res.end();
    });
});
上面的代码片段使用 setInterval() 模拟向客户端发送数据 10 秒,然后结束连接。客户端将收到连接丢失的错误并自动尝试重新建立连接。为避免这种情况,您可以在出错时关闭客户端,或者让浏览器发送一个特定的事件消息,客户端理解该消息可以正常关闭。如果客户端关闭连接,我们可以捕获 'close' 事件以优雅地结束服务器上的连接并停止发送事件。
快递:4.17.1 节点:10.16.3
| 归档时间: | 
 | 
| 查看次数: | 10414 次 | 
| 最近记录: |