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.