0

I'm following a tutorial and trying to make a simple node.js server using mysql and an Ec2 instance. The problem is, I keep getting the error 'node.js:201 throw e; // process.nextTick error, or 'error' event on first tick ^ ReferenceError: client is not defined at Object. (/var/www/app.js:28:3)'

I have no idea why it's doing that. I have the correct file loaded into my index.html:

<!DOCTYPE html>

<html>
<head>
        <title></title>

        <script src="http://54.213.60.208:8080/socket.io/socket.io.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

</head>
<body>

        <script type="text/javascript">

        $(document).ready(function() {
  var socket  = io.connect('http://54.213.60.208:8080');

 $('#save').click(function() {
    if ($('#employee_name').val() == '' || $('#employee_salary').val() == '') {
      return alert('Please enter both name/salary!');
    }
    var data = {
      name: $('#employee_name').val(),
      salary: $('#employee_salary').val()
    };
    socket.emit('add employee', data);
    $('#employee_name').val('');
    $('#employee_salary').val('');
  });

 socket.on('populate', function(data) {
    var out = "";
    $.each(data, function(i, obj) {
      out += "<li>"+obj.name+" is making "+obj.salary+"</li>";
    });
    $('#employees').html(out);
  });
});

        </script>

<b>Create new employee</b>
<div>Name: <input id="employee_name" value="" type="text"></div>
<div>Salary: <input id="employee_salary" value="" type="text"></div>
<div><input value="Save" id="save" type="button"></div>

<br>
<b>List of Employees:</b>
<ul id="employees"></ul>

</body>
</html>

Here's my server code:

var fs = require('fs');
var db_helper = require("./db_helper.js");

var app = require('http').createServer(function handler(req, res) {
  fs.readFile(__dirname + '/index.html', function(err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    } else {
      res.writeHead(200);
      res.end(data);
    }
  });
}).listen(8080);


var io = require('socket.io').listen(app);
io.sockets.on('connection', function(client) {
  console.log('Client connected');

  // populate employees on client
  db_helper.get_employees(function(employees) {
    client.emit('populate', employees);
  });
});

// client add new employee
  client.on('add employee', function(data) {
    // create employee, when its done repopulate employees on client
    db_helper.add_employee(data, function(lastId) {
      // repopulate employees on client
      db_helper.get_employees(function(employees) {
        client.emit('populate', employees);
      });
    });
});

Finally, my Mysql file:

var mysql = require('mysql');
var MYSQL_USERNAME = 'root';
var MYSQL_PASSWORD = 'RMWpsu@13';

var client = mysql.createConnection({
  user: MYSQL_USERNAME,
  password: MYSQL_PASSWORD,
});

// destroy old db
client.query('DROP DATABASE IF EXISTS mynode_db', function(err) {
  if (err) { throw err; }
});

// create database
client.query('CREATE DATABASE mynode_db', function(err) {
  if (err) { throw err; }
});
console.log('database mynode_db is created.');
client.query('USE mynode_db');

// create table
var sql = ""+
"create table employees("+
" id int unsigned not null auto_increment,"+
" name varchar(50) not null default 'unknown',"+
" salary dec(10,2) not null default 100000.00,"+
" primary key (id)"+
");";
client.query(sql, function(err) {
  if (err) { throw err; }
});
console.log('table employees is created.');

// function to create employee
exports.add_employee = function(data, callback) {
 client.query("insert into employees (name, salary) values (?,?)", [data.name, data.salary], function(err, info) {
    // callback function returns last insert id
    callback(info.insertId);
    console.log('Employee '+data.name+' has salary '+data.salary);
  });
}

1 Answer 1

1

The error is exactly what it sounds like. client is not defined because you have your client.on call outside of the io.sockets.on('connection', function(client) { function. It needs to be inside.

io.sockets.on('connection', function(client) {
  console.log('Client connected');

  // populate employees on client
  db_helper.get_employees(function(employees) {
    client.emit('populate', employees);
  });

  // client add new employee
  client.on('add employee', function(data) {
    // create employee, when its done repopulate employees on client
    db_helper.add_employee(data, function(lastId) {
      // repopulate employees on client
      db_helper.get_employees(function(employees) {
        client.emit('populate', employees);
      });
    });
  });
});
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.