javascript - io.sockets is defined, but socket isn't -


io.sockets.emit works fine , sends message out connected sockets, socket.emit doesn't work , socket undefined.

any ideas?

var app = require('express')();   var http = require('http').server(app);   var io = require('socket.io')(http);   var net = require('net');   var express = require('express');   var sqlite3 = require('sqlite3').verbose();   var db = new sqlite3.database('test-db.db');     var tools = require('./public/js/tools.js');   var app_tools = require('./public/js/app.js');    db.serialize(function() {           db.run("create table if not exists names (info text)");   });    app.use(express.static(__dirname + '/public'));    app.get('/', function(req, res){     res.sendfile(__dirname + '/index.html');   });    io.on('connection', function(socket){           socket.on('chat message', function(msg){       console.log('message geomon-ui: ' + msg);       if(msg.indexof("add") >= 0)       {           console.log("adding database table");         var words = msg.split(' ');         console.log("name add = " + words[1]);         var insertstring = "insert names  (info) values ('" +   words[1] + "')";           db.run(insertstring);           db.each("select rowid id, info names", function(err, row) {           console.log(row.id + ": " + row.info);           });       }       else if(msg.indexof("delete") >= 0)       {         console.log("deleting database table");         var words = msg.split(' ');         console.log("name delete = " + words[1]);         var deletestring = "delete names (info) = '" + words[1] + "'";         console.log(deletestring);         db.run(deletestring);         db.each("select rowid id, info names", function(err, row) {           console.log(row.id + ": " + row.info);         });       }       else if(msg == "print")       {           db.each("select rowid id, info names", function(err, row) {           console.log(row.id + ": " + row.info);           });       }       else if(msg == "status off")       {         console.log(socket);         console.log(io.sockets);            socket.emit("colorchange", { status: 'off' });       }       else if(msg == "status on")       {        io.sockets.emit("colorchange", { status: 'on' });       }       else if(msg == "hello")       {           tools.hello();       }       else if(msg == "send")       {         var host = '10.1.1.200';         var writeport = 8889;         var socket = net.createconnection(writeport, host);         socket.write('status=encrypt input=kyle');          var readport  = 8888;         var tcpserver = net.createserver(function(sock) {             console.log('connected: ' + sock.remoteaddress +':'+ sock.remoteport);             sock.on('data', function(data) {                 console.log('data ' + sock.remoteaddress + ': ' + data);                 var cont = data.tostring();                 io.sockets.emit("printmessage", { content: cont });             });              sock.on('uncaughtexception', function(err) {               console.log(err);             });              sock.on('error', function() {               console.log("error");             });              sock.on('end', function() {               tcpserver.close();             });           }).listen(readport, host);       }     });   });    http.listen(3000, function(){     console.log('listening on localhost:3000');   }); 

edit: here exact code im running. if run this, go input text box , type "status off" can see socket undefined.

the problem line:

var socket = net.createconnection(writeport, host); 

in javascript, variables "hoisted" "top" of scope.

in case, you're doing similar this:

socket.on('chat message', function(msg) {   var socket; // clobber previous 'socket' variable!    if (msg == "status off") {     // socket _will_ undefined here!   } ...   else if (msg == "send") {     socket = net.createconnect(...);   } }); 

if blocks don't start new scope, variable declarations in if blocks hoisted.

quickest solution: don't name variable socket, call else.


Popular posts from this blog