チュートリアルに従って、mysql と Ec2 インスタンスを使用して単純な node.js サーバーを作成しようとしています。問題は、「node.js:201 throw e;」というエラーが発生し続けることです。// process.nextTick エラー、または最初のティックでの 'error' イベント ^ ReferenceError: client is not defined at Object. (/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);
});
}