2016-03-31 4 views
-1

У меня есть настроенный nginx экземпляр сервера, который работает вместе с некоторыми Node.js случаях, как это:сервер Node.js не работает без вызова «конец()» для сервера Sent Events

Nginx часть:

upstream app_nodeSocketServer { 
    server 127.0.0.1:3001; 
} 

[...] 

location /nodeSocket { 
    proxy_pass http://app_nodeSocketServer/; 
} 

Node.js часть:

var express = require('express'); 
var app = express(); 
var os = require("os"); 


app.get('/', function (req, res) { 

    res.writeHead(200, { 
     "Content-Type": "text/event-stream", 
     "Cache-Control": "no-cache", 
     "Connection": "keep-alive" 
    }); 

// var interval = setInterval(function() { 
     res.write("data: Uptime: " + os.uptime() + "\n\n"); 
     res.end(); 
// }, 1000); 


    /* req.connection.addListener("close", function() { 
     clearInterval(interval); 
    }, false);*/ 

}); 


app.listen(3001, function() { 
    console.log('Example app listening on port 3001!'); 
}); 

Итак, если я вызываю http://domain/nodeSocket, вызывается часть node.js и отображается ответ.

Использование его с сервера отправлено событий:

<html> 
<head> 
</head> 
<body> 

<h1>Getting server updates</h1> 
<div id="result"></div> 

<script> 

    var url = "http://domain/nodeSocket"; 
    var source = new EventSource(url); 
    source.onmessage = function(event) { 
     console.log(event.data); 
     document.getElementById("result").innerHTML = event.data + "<br>"; 
    }; 
</script> 

Это также работает.

Вопрос

Во всех примерах, которые используют Node.js вместе с сервером отправлено событий я не вижу ни одной строчки res.end(). Но когда я удаляю эту строку из своего кода, события, которые больше не отображаются.

В чем причина такого поведения?

В настоящий момент клиентский вызов на стороне сервера вызывается каждые три секунды, поскольку это стандартное значение повторного подключения после того, как серверная сторона закрыла свое соединение.

Насколько я понимаю, серверная сторона не должна закрывать соединение, а отправлять данные до тех пор, пока клиент не будет «уничтожен».

+0

https://nodejs.org/en/about/ событие Самый простой код сервера имеет 'res.end()' –

+0

Посмотрите на 'https://segment.com/blog/2014- 04-03-server-sent-events-the-simpleest-realtime-browser-spec/'или' http://stackoverflow.com/questions/31700336/server-sent-event-eventsource-with-node-js-express '. Нет вызовов 'res.end()'. Для простого сервера узлов вы правы, но не при использовании SSE. Из-за этого вы отказались? – sk2212

+0

Ах, в вашем случае вам нужно отключить буферизацию прокси-сервера nginx, иначе nginx ждет ответа на ответ перед ответом клиенту. См. Http://nginx.org/r/proxy_buffering –

ответ

1

Вы должны отключить буферизацию прокси-сервера nginx, иначе nginx ждет завершения ответа перед ответом клиенту. См. http://nginx.org/r/proxy_buffering для получения более подробной информации.