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 -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の方法をできるだけ使うことができます.