Los datos en continuo con Node.js
-
23-09-2019 - |
Pregunta
Me gustaría saber si es posible transmitir datos desde el servidor al cliente con Node.js. Quiero publicar una sola petición AJAX para Node.js, a continuación, dejar la conexión de datos abiertos y de forma continua la corriente al cliente. El cliente recibirá esta corriente y actualizar la página de forma continua.
Actualización:
Como una actualización de esta respuesta - No puedo conseguir este trabajar. El response.write
no se envía antes de llamar close
. He creado un programa de ejemplo que utilizo para lograr esto:
Node.js:
var sys = require('sys'),
http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
var currentTime = new Date();
setInterval(function(){
res.write(
currentTime.getHours()
+ ':' +
currentTime.getMinutes()
+ ':' +
currentTime.getSeconds()
);
},1000);
}).listen(8000);
HTML:
<html>
<head>
<title>Testnode</title>
</head>
<body>
<!-- This fields needs to be updated -->
Server time: <span id="time"> </span>
<!-- import jQuery from google -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<!-- import jQuery -->
<script type="text/javascript">
$(document).ready(function(){
// I call here node.localhost nginx ports this to port 8000
$('#time').load('http://node.localhost');
});
</script>
</body>
</html>
El uso de este método que no regreso nada hasta que close()
llamada. ¿Es esto posible o debería ir con un enfoque de sondeo largo lugar en el que llama a la función de carga de nuevo como uno entra?
Solución
Es posible. Sólo tiene que usar response.write () varias veces.
var body = ["hello world", "early morning", "richard stallman", "chunky bacon"];
// send headers
response.writeHead(200, {
"Content-Type": "text/plain"
});
// send data in chunks
for (piece in body) {
response.write(body[piece], "ascii");
}
// close connection
response.end();
Es posible que tenga que cerrar y volver a abrir la conexión cada 30 segundos más o menos.
editar : este es el código realmente Probé:
var sys = require('sys'),
http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
var currentTime = new Date();
sys.puts('Starting sending time');
setInterval(function(){
res.write(
currentTime.getHours()
+ ':' +
currentTime.getMinutes()
+ ':' +
currentTime.getSeconds() + "\n"
);
setTimeout(function() {
res.end();
}, 10000);
},1000);
}).listen(8090, '192.168.175.128');
I conectado a él por Telnet y su efecto, da hacia fuera respuesta fragmentada. Pero para usarlo en el navegador AJAX tiene que apoyar XHR.readyState = 3 (respuesta parcial). No todos los navegadores son compatibles con esta, por lo que yo sé. Así que es mejor utilizar el sondeo largo (o WebSockets para Chrome / Firefox).
Edit2 : También, si usa Nginx como proxy inverso al nodo, a veces se quiere reunir todos los trozos y enviarla al usuario a la vez. Es necesario que ajustar.
Otros consejos
Mira Sockets.io. Proporciona HTTP / HTTPS streaming y utiliza diversos medios de transporte para hacerlo:
- WebSocket
- WebSocket sobre flash (+ XML apoyo a la política de seguridad)
- XHR sondeo
- XHR multiparte Transmisión
- Para siempre iframe
- JSONP Polling (por dominios)
Y! Funciona a la perfección con Node.js. Es también un paquete de NGP.
También se puede anular el bucle infinito:
app.get('/sse/events', function(req, res) {
res.header('Content-Type', 'text/event-stream');
var interval_id = setInterval(function() {
res.write("some data");
}, 50);
req.socket.on('close', function() {
clearInterval(interval_id);
});
});
Este es un ejemplo de expressjs. Creo que sin expressjs serán algo así.