2013-07-23 52 views
0

我下面的教程,並試圖使一個簡單的node.js服務器使用MySQL和EC2實例。問題是,我不斷收到錯誤'node.js:201 throw e; // process.nextTick錯誤,或在第一蜱 ^ 的ReferenceError「錯誤」事件:客戶端沒有定義 在對象。 (/var/www/app.js:28:3)」Node.js的插座IO「錯誤:客戶端沒有定義」

我不知道爲什麼它這樣做。我已經正確的文件加載到我的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 = '[email protected]'; 

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

錯誤正是它聽上去像。 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); 
     }); 
    }); 
    }); 
}); 
+0

沒錯,這做到了!非常感謝! – pj409