node.js Socket io'错误:客户端未定义'

时间:2013-07-23 16:19:58

标签: mysql node.js amazon-ec2 socket.io

我正在学习一个教程并尝试使用mysql和一个Ec2实例创建一个简单的node.js服务器。问题是,我不断收到错误'node.js:201         扔掉; // process.nextTick错误,或第一次打勾时的'错误'事件               ^ ReferenceError:未定义客户端     在对象。 (/var/www/app.js:28:3)'

我不知道为什么会这样做。我有正确的文件加载到我的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>

这是我的服务器代码:

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);
      });
    });
});

最后,我的Mysql文件:

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 个答案:

答案 0 :(得分:1)

错误正是它听起来的样子。未定义client,因为您在client.on函数之外进行了io.sockets.on('connection', function(client) {调用。它需要在里面。

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);
      });
    });
  });
});