html - Res.write no funciona cuando se envía continuamente paquetes UDP
node.js (1)
//Sending UDP message to TFTP server
//dgram modeule to create UDP socket
var express= require(''express''), fs= require(''fs''),path = require(''path''),util = require(''util''),dgram= require(''dgram''),client= dgram.createSocket(''udp4''),bodyParser = require(''body-parser''),app = express(), ejs = require(''ejs'');
var plotly = require(''plotly'')("Patidar", "ku0sisuxfm")
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
app.use(express.static(''public''));
//Reading in the html file for input page
app.get(''/'', function(req, res){
var html = fs.readFileSync(''index2.html'');
res.writeHead(200, {''Content-Type'': ''text/html''});
res.end(html);
});
//reading in html file for output page
app.get(''/output'', function(req, res){
var html = fs.readFileSync(''index4.html'');
res.writeHead(200, {''Content-Type'': ''text/html''});
res.end(html);
});
//Recieving UDP message
app.post(''/output'', function(req, res){
var once= req.body.submit;
if (once == "Once") {
//Define the host and port values of UDP
var HOST= req.body.ip;
var PORT= req.body.port;
//Reading in the user''s command, converting to hex
var message = new Buffer(req.body.number, ''hex'');
//Sends packets to TFTP
client.send(message, 0, message.length, PORT, HOST, function (err, bytes) {
if (err) throw err;
});
//Recieving message back and printing it out to webpage
client.on(''message'', function (message) {
fs.readFile(''index3.html'', ''utf-8'', function(err, content) {
if (err) {
res.end(''error occurred'');
return;
}
var temp = message.toString(); //here you assign temp variable with needed value
var renderedHtml = ejs.render(content, {temp:temp, host: HOST, port: PORT}); //get redered HTML code
res.end(renderedHtml);
//var data = [{x:[req.body.number], y:[temp], type: ''scatter''}];
//var layout = {fileopt : "overwrite", filename : "simple-node-example"};
//plotly.plot(data, layout, function (err, msg) {
//if (err) return console.log(err);
//console.log(msg);
//});
});
});
}
if (once == "continuous") {
var timesRun = 0;
var requestLoop = setInterval(function(){
timesRun += 1;
if(timesRun === 5){
clearInterval(requestLoop);
}
//Define the host and port values of UDP
var HOST= req.body.ip;
var PORT= req.body.port;
//Reading in the user''s command, converting to hex
var message = new Buffer(req.body.number, ''hex'');
//Sends packets to TFTP
client.send(message, 0, message.length, PORT, HOST, function (err, bytes) {
if (err) throw err;
});
//Recieving message back and printing it out to webpage
client.on(''message'', function (message) {
fs.readFile(''index3.html'', ''utf-8'', function(err, content) {
if (err) {
res.end(''error occurred'');
return;
}
var temp = message.toString(); //here you assign temp variable with needed value
var renderedHtml = ejs.render(content, {temp:temp, host: HOST, port: PORT}); //get redered HTML code
res.write(renderedHtml);
//var data = [{x:[req.body.number], y:[temp], type: ''scatter''}];
//var layout = {fileopt : "overwrite", filename : "simple-node-example"};
//plotly.plot(data, layout, function (err, msg) {
//if (err) return console.log(err);
//console.log(msg);
//});
});
});
}, 10000);
}
});
//Setting up listening server
app.listen(3000, "192.168.0.136");
console.log(''Listening at 192.168.0.136:3000'');
Tengo dos botones, un botón envía el paquete UDP una vez, mientras que un botón continuo envía los mismos paquetes UDP cada 10 segundos. Sin embargo, cuando se presiona este botón, res.write repite todo el resultado nuevamente. Mire la foto adjunta para ver la salida [! [Introduzca la descripción de la imagen aquí] [1]] [1]
Después de poner su código en un formateador de código automático para hacerlo legible, puedo ver que está haciendo esto:
client.on(''message'', function (message) { ...
dentro de su controlador app.post()
. Eso significa que cada vez que se llama a su controlador de publicación, agrega otro client.on(''message'', ...)
. Entonces, después de que se llama la segunda vez, tienes dos manejadores de eventos, después de que se llama la tercera vez, tienes tres y así sucesivamente.
Entonces, tan pronto como tenga estos duplicados, se llamará a cada uno y se aplicarán acciones duplicadas.
Tus elecciones son:
- Utilice
.once()
para el manejador de eventos para que se elimine automáticamente después de que se active. - Quítelo manualmente después de que se dispare o cuando haya terminado con él.
-
app.post()
una vez fuera de su controladorapp.post()
para que nunca agregue duplicados. - Reestructura la forma en que funciona tu código para que no tenga este tipo de problema. Por ejemplo, tiene dos manejadores diferentes para el mismo mensaje entrante. Este es un signo de código con mucho estado que es más complejo de escribir correctamente. Un mejor diseño que no sea con estado de esa manera sería más simple.