Heim > Web-Frontend > js-Tutorial > Tutorial zum Einrichten einer Windows+Node.js+MySQL-Umgebung über node-mysql_node.js

Tutorial zum Einrichten einer Windows+Node.js+MySQL-Umgebung über node-mysql_node.js

WBOY
Freigeben: 2016-05-16 15:12:40
Original
2212 Leute haben es durchsucht

Vorwort

MySQL ist ein häufig verwendetes Open-Source-Datenbankprodukt und normalerweise die erste Wahl für kostenlose Datenbanken. Ich habe die NPM-Liste überprüft und festgestellt, dass Nodejs über 13 Bibliotheken verfügt, die auf MySQL zugreifen können. felixge/node-mysql scheint das beliebteste Projekt zu sein, also habe ich beschlossen, es auszuprobieren.

Achten Sie auf den Namen, „felixge/node-mysql“ ist nicht „node-mysql“, diese Episode wird im Installationsteil vorgestellt!

Inhaltsverzeichnis

  • Node-MySQL-Einführung
  • Erstellen Sie eine MySQL-Testbibliothek
  • Knoten-MySQL-Installation
  • Knoten-MySQL-Verwendung

1. Einführung in Node-MySQL

felixge/node-mysql ist ein MySQL-Client-Programm, das in reinen NodeJS mit Javascript implementiert ist. felixge/node-mysql kapselt die grundlegenden Operationen von Nodejs auf MySQL, 100 % öffentliche MIT-Lizenz.

Projektadresse: https://github.com/felixge/node-mysql

2. Erstellen Sie eine MySQL-Testbibliothek

MySQL-Testbibliothek lokal erstellen: 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)

Nach dem Login kopieren
mysql> GRANT ALL ON nodejs.* to nodejs@'%' IDENTIFIED BY 'nodejs';
mysql> GRANT ALL ON nodejs.* to nodejs@localhost IDENTIFIED BY 'nodejs';
Nach dem Login kopieren

Melden Sie sich erneut bei MySQL an

C:\Users\Administrator>mysql -unodejs -p
Enter password: ******

mysql> SHOW DATABASES;
+--------------------+
| Database      |
+--------------------+
| information_schema |
| nodejs       |
| test        |
+--------------------+
3 rows in set (0.00 sec)

Nach dem Login kopieren


mysql> USE nodejs
Database changed
Nach dem Login kopieren

Erstellen Sie eine neue Benutzertabelle

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);
Nach dem Login kopieren


mysql> SHOW TABLES;
+------------------+
| Tables_in_nodejs |
+------------------+
| t_user      |
+------------------+
1 row in set (0.04 sec)
Nach dem Login kopieren

3. Node-MySQL-Installation

Meine Systemumgebung

win7 64bit
Nodejs:v0.10.5
Npm:1.2.19
MySQL:Serverversion: 5.6.11 MySQL Community Server (GPL)
Projekt erstellen: nodejs-node-mysql

~ D:\workspace\javascript>mkdir nodejs-node-mysql
~ D:\workspace\javascript>cd nodejs-node-mysql
~ D:\workspace\javascript\nodejs-node-mysql>npm install node-mysql
node-mysql@0.2.0 node_modules\node-mysql
├── better-js-class@0.1.2
├── cps@0.1.7
├── underscore@1.5.2
└── mysql@2.0.0-alpha9 (require-all@0.0.3, bignumber.js@1.0.1)
Nach dem Login kopieren

Hier ist eine kleine Folge

Öffnen Sie nach der Installation von „node-mysql“ die Datei package.json und stellen Sie fest, dass die Projektadresse

lautet

https://github.com/redblaze/node-mysql.git
Wie Sie der Abhängigkeitsbeziehung entnehmen können, hängt sie von der MySQL-Bibliothek ab und ist eine Kapselung von felixge/node-mysql.

node-mysql1

Da der Stern dieses Projekts 0 ist, ist auch der Fork 0. Daher werde ich keine Zeit damit verbringen, es zu testen und das felixge/node-mysql-Paket neu zu installieren.

Node-MySQL neu installieren

~ D:\workspace\javascript\nodejs-node-mysql>rm -rf node_modules
~ D:\workspace\javascript\nodejs-node-mysql>npm install mysql@2.0.0-alpha9
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
mysql@2.0.0-alpha9 node_modules\mysql
├── require-all@0.0.3
└── bignumber.js@1.0.1
Nach dem Login kopieren

Das war's dieses Mal, lasst uns die Entwicklung fortsetzen!

Erstellen Sie die Startdatei des Knotenprogramms: app.js

Erster Test

~ vi app.js
Nach dem Login kopieren
Nach dem Login kopieren
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();

Nach dem Login kopieren

Knoten ausführen

~ D:\workspace\javascript\nodejs-node-mysql>node app.js
The solution is: 2
Nach dem Login kopieren

Auf diese Weise ermöglichen wir Nodejs eine Verbindung zu MySQL.

4. Verwenden von Node-MySQL

Jetzt werden wir allgemeine Tests für die Node-MySQL-API durchführen.

Tabelle neu, gelöscht, geändert und geprüft
Konfiguration des Verbindungspools
MySQL trennt die Verbindung und stellt die Verbindung wieder her
Verbindungspool-Timeout-Test
1). Überprüfen Sie die Neuheit, Löschung und Änderung der Tabelle
app.js ändern

~ vi app.js
Nach dem Login kopieren
Nach dem Login kopieren
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();

Nach dem Login kopieren

Konsolenausgabe:

D:\workspace\javascript\nodejs-node-mysql>node app.js
Nach dem Login kopieren
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 (中国标准时间) }
Nach dem Login kopieren

Aufgrund der asynchronen Natur des Knotens ist der obige Vorgang ein kontinuierlicher Vorgang und der Code wird in Fragmenten geschrieben. Wir können den obigen Code über die asynchrone Bibliothek kapseln. Weitere Informationen finden Sie im Artikel: Nodejs asynchrone Prozesssteuerung Async

2). Verbindungspoolkonfiguration

Datei hinzufügen: app-pooling.js

~ vi app-pooling.js

Nach dem Login kopieren
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();
  });
});

Nach dem Login kopieren

Konsolenausgabe:

D:\workspace\javascript\nodejs-node-mysql>node app-pooling.js
Nach dem Login kopieren
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 (中国标准时间) }
Nach dem Login kopieren

3). MySQL wurde getrennt und erneut verbunden

Simulieren Sie jeweils 3 Arten von Fehlern

a. Falsches Login-Passwort
b. Die Datenbank ist ausgefallen
c. Zeitüberschreitung der Datenbankverbindung
Neue Datei: app-reconnect.js

~ vi app-reconnect.js

Nach dem Login kopieren
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();

Nach dem Login kopieren

a. Falsches Simulationspasswort

Passwort ändern: „nodejs11“

Konsolenausgabe.

D:\workspace\javascript\nodejs-node-mysql>node app-reconnect.js
Nach dem Login kopieren
Nach dem Login kopieren
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 }
Nach dem Login kopieren

b. Ausfallzeit der Datenbank simulieren
Starten Sie den Knoten normal und beenden Sie dann den MySQL-Prozess.

Konsolenausgabe.


D:\workspace\javascript\nodejs-node-mysql>node app-reconnect.js
Nach dem Login kopieren
Nach dem Login kopieren
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)

Nach dem Login kopieren

Diese Ausnahme führt direkt dazu, dass das Knotenprogramm beendet wird!

c. Simulierter Verbindungs-Timeout, PROTOCOL_CONNECTION_LOST
Wechseln Sie zum Root-Konto, ändern Sie den Parameter wait_timeout von MySQL und stellen Sie ihn auf ein Timeout von 10 Millisekunden ein.

~ 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)

Nach dem Login kopieren

Ändern Sie die Datei: app-reconnection.js und fügen Sie am Ende Code hinzu

~ vi app-reconnection.js

Nach dem Login kopieren
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);

Nach dem Login kopieren

Das Programm führt alle 15 Sekunden eine Abfrage durch.

Konsolenausgabe

D:\workspace\javascript\nodejs-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' } ]
Nach dem Login kopieren

Unser eigenes Programm hat die Ausnahme „PROTOCOL_CONNECTION_LOST“ abgefangen und die Datenbank automatisch wieder verbunden.

4). Timeout-Test des MySQL-Verbindungspools

Für das Problem „wait_timeout“ testen wir die Verbindung erneut.

App-pooling.js-Datei ändern

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

Nach dem Login kopieren

Konsolenausgabe:

D:\workspace\javascript\nodejs-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' } ]
Nach dem Login kopieren

Der Verbindungspool hat das Problem der automatischen Wiederverbindung gelöst. Wir können Pooling in unserer nachfolgenden Entwicklung so weit wie möglich nutzen.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage