Node-mysqlでWindows+Nodeを構築します.js+MySQL環境のチュートリアル
15009 ワード
前言
MySQLは一般的なオープンソースデータベース製品であり、通常は無料データベースの第一選択でもあります.NPMリストを調べてみると、NodejsにはMySQLにアクセスできる13ライブラリがあり、felixge/node-mysqlが最も注目されているようで、私も試してみることにしました.
名前に注意して、「felixge/node-mysql」非「node-mysql」、インストール部分ではこのエピソードを紹介します!
目次 node-mysql紹介 MySQLテストライブラリ を構築 node-mysqlインストール node-mysql を使用
1.node-mysql紹介
felixge/node-mysqlは、javascriptで実装された純粋なnodejsのMySQLクライアントプログラムです.felixge/node-mysqlは、MySQLに対するNodejsの基本操作、100%MIT共通ライセンスをカプセル化しています.
プロジェクトのアドレス:https://github.com/felixge/node-mysql
2.MySQLテストライブラリの作成
MySQLテストライブラリのローカル作成:nodejs
MySQLに再ログイン
新しいuserテーブル
3.node-mysqlインストール
マイシステム環境
win7 64bit Nodejs:v0.10.5 Npm:1.2.19 MySQL:Server version:5.6.11 MySQL Community Server(GPL)作成プロジェクト:nodejs-node-mysql
ここにエピソードがあります
「node-mysql」をインストールし、packageを開きます.jsonファイルは、このプロジェクトのアドレスが
https://github.com/redblaze/node-mysql.git依存関係からmysqlライブラリに依存し、felixge/node-mysqlのパッケージであることがわかります.
node-mysql1
このプロジェクトstarは0なのでforkも0です.だから、テストに時間をかけてfelixge/node-mysqlのパッケージを再インストールするつもりはありません.
node-mysqlの再インストール
今回は正しかったので、次の開発を続けます!
Nodeプログラム起動ファイルの作成:app.js
最初のテスト
nodeの実行
これでNodejsにMySQLに接続させました.
4.node-mysql使用
次にnode-mysqlのAPIについてよく使われるテストを行います.
表新規削除接続プール構成MySQL断線再接続プールタイムアウトテスト1)を調べる.表の新しい削除と修正app.js
コンソール出力:
Nodeの非同期のため、上は連続的な操作で、コードは支離滅裂に書かれます.上記のコードはasyncライブラリでカプセル化できます.記事:Nodejs非同期プロセス制御Asyncを参照してください.
2). 接続プールの構成
追加ファイル:app-pooling.js
コンソール出力:
3). MySQL断線再接続
それぞれ3種類のエラーをシミュレート
a.ログインパスワードエラーb.データベースダウンタイムc.データベース接続タイムアウト新規ファイル:app-reconnect.js
a.アナログパスワードエラー
passwordの変更:'nodejs 11'
コンソール出力.
b.アナログデータベースのダウンタイムは正常にnodeを起動し、mysqldのプロセスを殺す.
コンソール出力.
この異常は、nodeプログラムが殺されることを直接招く!
c.アナログ接続タイムアウト、PROTOCOL_CONNECTION_LOSTはrootアカウントに切り替え、MySQLのwait_を修正timeoutパラメータ、10ミリ秒タイムアウトに設定します.
ファイルの変更:app-reconnection.js、最後にコードを追加
プログラムは15秒ごとに溶けて、クエリーをします.
コンソール出力
独自のプログラムで「PROTOCOL_CONNECTION_LOST」異常をキャプチャし、データベース再接続を自動的に実現しました.
4). MySQL接続プールのタイムアウトテスト
wait_の場合timeoutの問題ですが、接続をもう一度テストします.
app-poolingを変更します.jsファイル
コンソール出力:
接続プールは、自動再接続の問題を解決しました.後で私たちの開発では、poolingの方法をできるだけ使うことができます.
MySQLは一般的なオープンソースデータベース製品であり、通常は無料データベースの第一選択でもあります.NPMリストを調べてみると、NodejsにはMySQLにアクセスできる13ライブラリがあり、felixge/node-mysqlが最も注目されているようで、私も試してみることにしました.
名前に注意して、「felixge/node-mysql」非「node-mysql」、インストール部分ではこのエピソードを紹介します!
目次
1.node-mysql紹介
felixge/node-mysqlは、javascriptで実装された純粋なnodejsのMySQLクライアントプログラムです.felixge/node-mysqlは、MySQLに対するNodejsの基本操作、100%MIT共通ライセンスをカプセル化しています.
プロジェクトのアドレス:https://github.com/felixge/node-mysql
2.MySQLテストライブラリの作成
MySQLテストライブラリのローカル作成:nodejs
~ mysql -uroot -p
mysql> CREATE DATABASE nodejs;
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| nodejs |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
mysql> GRANT ALL ON nodejs.* to nodejs@'%' IDENTIFIED BY 'nodejs';
mysql> GRANT ALL ON nodejs.* to nodejs@localhost IDENTIFIED BY 'nodejs';
MySQLに再ログイン
C:\Users\Administrator>mysql -unodejs -p
Enter password: ******
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| nodejs |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql> USE nodejs
Database changed
新しいuserテーブル
CREATE TABLE t_user(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(16) NOT NULL ,
create_date TIMESTAMP NULL DEFAULT now()
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE UNIQUE INDEX t_quiz_IDX_0 on t_user(name);
mysql> SHOW TABLES;
+------------------+
| Tables_in_nodejs |
+------------------+
| t_user |
+------------------+
1 row in set (0.04 sec)
3.node-mysqlインストール
マイシステム環境
win7 64bit Nodejs:v0.10.5 Npm:1.2.19 MySQL:Server version:5.6.11 MySQL Community Server(GPL)作成プロジェクト:nodejs-node-mysql
~ D:\workspace\javascript>mkdir nodejs-node-mysql
~ D:\workspace\javascript>cd nodejs-node-mysql
~ D:\workspace\javascript
odejs-node-mysql>npm install node-mysql
[email protected] node_modules
ode-mysql
├── [email protected]
├── [email protected]
├── [email protected]
└── [email protected] ([email protected], [email protected])
ここにエピソードがあります
「node-mysql」をインストールし、packageを開きます.jsonファイルは、このプロジェクトのアドレスが
https://github.com/redblaze/node-mysql.git依存関係からmysqlライブラリに依存し、felixge/node-mysqlのパッケージであることがわかります.
node-mysql1
このプロジェクトstarは0なのでforkも0です.だから、テストに時間をかけてfelixge/node-mysqlのパッケージを再インストールするつもりはありません.
node-mysqlの再インストール
~ D:\workspace\javascript
odejs-node-mysql>rm -rf node_modules
~ D:\workspace\javascript
odejs-node-mysql>npm install [email protected]
npm http GET https://registry.npmjs.org/mysql/2.0.0-alpha9
npm http 200 https://registry.npmjs.org/mysql/2.0.0-alpha9
npm http GET https://registry.npmjs.org/mysql/-/mysql-2.0.0-alpha9.tgz
npm http 200 https://registry.npmjs.org/mysql/-/mysql-2.0.0-alpha9.tgz
npm http GET https://registry.npmjs.org/require-all/0.0.3
npm http GET https://registry.npmjs.org/bignumber.js/1.0.1
npm http 304 https://registry.npmjs.org/require-all/0.0.3
npm http 304 https://registry.npmjs.org/bignumber.js/1.0.1
[email protected] node_modules\mysql
├── [email protected]
└── [email protected]
今回は正しかったので、次の開発を続けます!
Nodeプログラム起動ファイルの作成:app.js
最初のテスト
~ vi app.js
var mysql = require('mysql');
var conn = mysql.createConnection({
host: 'localhost',
user: 'nodejs',
password: 'nodejs',
database:'nodejs',
port: 3306
});
conn.connect();
conn.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
if (err) throw err;
console.log('The solution is: ', rows[0].solution);
});
conn.end();
nodeの実行
~ D:\workspace\javascript
odejs-node-mysql>node app.js
The solution is: 2
これでNodejsにMySQLに接続させました.
4.node-mysql使用
次にnode-mysqlのAPIについてよく使われるテストを行います.
表新規削除接続プール構成MySQL断線再接続プールタイムアウトテスト1)を調べる.表の新しい削除と修正app.js
~ vi app.js
var mysql = require('mysql');
var conn = mysql.createConnection({
host: 'localhost',
user: 'nodejs',
password: 'nodejs',
database: 'nodejs',
port: 3306
});
conn.connect();
var insertSQL = 'insert into t_user(name) values("conan"),("fens.me")';
var selectSQL = 'select * from t_user limit 10';
var deleteSQL = 'delete from t_user';
var updateSQL = 'update t_user set name="conan update" where name="conan"';
//delete
conn.query(deleteSQL, function (err0, res0) {
if (err0) console.log(err0);
console.log("DELETE Return ==> ");
console.log(res0);
//insert
conn.query(insertSQL, function (err1, res1) {
if (err1) console.log(err1);
console.log("INSERT Return ==> ");
console.log(res1);
//query
conn.query(selectSQL, function (err2, rows) {
if (err2) console.log(err2);
console.log("SELECT ==> ");
for (var i in rows) {
console.log(rows[i]);
}
//update
conn.query(updateSQL, function (err3, res3) {
if (err3) console.log(err3);
console.log("UPDATE Return ==> ");
console.log(res3);
//query
conn.query(selectSQL, function (err4, rows2) {
if (err4) console.log(err4);
console.log("SELECT ==> ");
for (var i in rows2) {
console.log(rows2[i]);
}
});
});
});
});
});
//conn.end();
コンソール出力:
D:\workspace\javascript
odejs-node-mysql>node app.js
DELETE Return ==>
{ fieldCount: 0,
affectedRows: 2,
insertId: 0,
serverStatus: 34,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0 }
INSERT Return ==>
{ fieldCount: 0,
affectedRows: 2,
insertId: 33,
serverStatus: 2,
warningCount: 0,
message: '&Records: 2 Duplicates: 0 Warnings: 0',
protocol41: true,
changedRows: 0 }
SELECT ==>
{ id: 33,
name: 'conan',
create_date: Wed Sep 11 2013 12:09:15 GMT+0800 ( ) }
{ id: 34,
name: 'fens.me',
create_date: Wed Sep 11 2013 12:09:15 GMT+0800 ( ) }
UPDATE Return ==>
{ fieldCount: 0,
affectedRows: 1,
insertId: 0,
serverStatus: 2,
warningCount: 0,
message: '(Rows matched: 1 Changed: 1 Warnings: 0',
protocol41: true,
changedRows: 1 }
SELECT ==>
{ id: 33,
name: 'conan update',
create_date: Wed Sep 11 2013 12:09:15 GMT+0800 ( ) }
{ id: 34,
name: 'fens.me',
create_date: Wed Sep 11 2013 12:09:15 GMT+0800 ( ) }
Nodeの非同期のため、上は連続的な操作で、コードは支離滅裂に書かれます.上記のコードはasyncライブラリでカプセル化できます.記事:Nodejs非同期プロセス制御Asyncを参照してください.
2). 接続プールの構成
追加ファイル:app-pooling.js
~ vi app-pooling.js
var mysql = require('mysql');
var pool = mysql.createPool({
host: 'localhost',
user: 'nodejs',
password: 'nodejs',
database: 'nodejs',
port: 3306
});
var selectSQL = 'select * from t_user limit 10';
pool.getConnection(function (err, conn) {
if (err) console.log("POOL ==> " + err);
conn.query(selectSQL,function(err,rows){
if (err) console.log(err);
console.log("SELECT ==> ");
for (var i in rows) {
console.log(rows[i]);
}
conn.release();
});
});
コンソール出力:
D:\workspace\javascript
odejs-node-mysql>node app-pooling.js
SELECT ==>
{ id: 39,
name: 'conan update',
create_date: Wed Sep 11 2013 13:41:18 GMT+0800 ( ) }
{ id: 40,
name: 'fens.me',
create_date: Wed Sep 11 2013 13:41:18 GMT+0800 ( ) }
3). MySQL断線再接続
それぞれ3種類のエラーをシミュレート
a.ログインパスワードエラーb.データベースダウンタイムc.データベース接続タイムアウト新規ファイル:app-reconnect.js
~ vi app-reconnect.js
var mysql = require('mysql');
var conn;
function handleError () {
conn = mysql.createConnection({
host: 'localhost',
user: 'nodejs',
password: 'nodejs',
database: 'nodejs',
port: 3306
});
// ,2
conn.connect(function (err) {
if (err) {
console.log('error when connecting to db:', err);
setTimeout(handleError , 2000);
}
});
conn.on('error', function (err) {
console.log('db error', err);
// ,
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
handleError();
} else {
throw err;
}
});
}
handleError();
a.アナログパスワードエラー
passwordの変更:'nodejs 11'
コンソール出力.
D:\workspace\javascript
odejs-node-mysql>node app-reconnect.js
error when connecting to db: { [Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'nodejs'@'localhost' (using pass
rd: YES)]
code: 'ER_ACCESS_DENIED_ERROR',
errno: 1045,
sqlState: '28000',
fatal: true }
error when connecting to db: { [Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'nodejs'@'localhost' (using pass
rd: YES)]
code: 'ER_ACCESS_DENIED_ERROR',
errno: 1045,
sqlState: '28000',
fatal: true }
b.アナログデータベースのダウンタイムは正常にnodeを起動し、mysqldのプロセスを殺す.
コンソール出力.
D:\workspace\javascript
odejs-node-mysql>node app-reconnect.js
db error { [Error: read ECONNRESET]
code: 'ECONNRESET',
errno: 'ECONNRESET',
syscall: 'read',
fatal: true }
Error: read ECONNRESET
at errnoException (net.js:884:11)
at TCP.onread (net.js:539:19)
この異常は、nodeプログラムが殺されることを直接招く!
c.アナログ接続タイムアウト、PROTOCOL_CONNECTION_LOSTはrootアカウントに切り替え、MySQLのwait_を修正timeoutパラメータ、10ミリ秒タイムアウトに設定します.
~ mysql -uroot -p
mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set global wait_timeout=10;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 10 |
+---------------+-------+
1 row in set (0.00 sec)
ファイルの変更:app-reconnection.js、最後にコードを追加
~ vi app-reconnection.js
function query(){
console.log(new Date());
var sql = "show variables like 'wait_timeout'";
conn.query(sql, function (err, res) {
console.log(res);
});
}
query();
setInterval(query, 15*1000);
プログラムは15秒ごとに溶けて、クエリーをします.
コンソール出力
D:\workspace\javascript
odejs-node-mysql>node app-reconnect.js
Wed Sep 11 2013 15:21:14 GMT+0800 ( )
[ { Variable_name: 'wait_timeout', Value: '10' } ]
db error { [Error: Connection lost: The server closed the connection.] fatal: true, code: 'PROTOCOL_CONNECTION_LOST' }
Wed Sep 11 2013 15:21:28 GMT+0800 ( )
[ { Variable_name: 'wait_timeout', Value: '10' } ]
db error { [Error: Connection lost: The server closed the connection.] fatal: true, code: 'PROTOCOL_CONNECTION_LOST' }
Wed Sep 11 2013 15:21:43 GMT+0800 ( )
[ { Variable_name: 'wait_timeout', Value: '10' } ]
独自のプログラムで「PROTOCOL_CONNECTION_LOST」異常をキャプチャし、データベース再接続を自動的に実現しました.
4). MySQL接続プールのタイムアウトテスト
wait_の場合timeoutの問題ですが、接続をもう一度テストします.
app-poolingを変更します.jsファイル
var mysql = require('mysql');
var pool = mysql.createPool({
host: 'localhost',
user: 'nodejs',
password: 'nodejs',
database: 'nodejs',
port: 3306
});
var selectSQL ="show variables like 'wait_timeout'";
pool.getConnection(function (err, conn) {
if (err) console.log("POOL ==> " + err);
function query(){
conn.query(selectSQL, function (err, res) {
console.log(new Date());
console.log(res);
conn.release();
});
}
query();
setInterval(query, 5000);
});
コンソール出力:
D:\workspace\javascript
odejs-node-mysql>node app-pooling.js
Wed Sep 11 2013 15:32:25 GMT+0800 ( )
[ { Variable_name: 'wait_timeout', Value: '10' } ]
Wed Sep 11 2013 15:32:30 GMT+0800 ( )
[ { Variable_name: 'wait_timeout', Value: '10' } ]
Wed Sep 11 2013 15:32:35 GMT+0800 ( )
[ { Variable_name: 'wait_timeout', Value: '10' } ]
接続プールは、自動再接続の問題を解決しました.後で私たちの開発では、poolingの方法をできるだけ使うことができます.