Heim  >  Artikel  >  Web-Frontend  >  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
WBOYOriginal
2016-05-16 15:12:402197Durchsuche

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)

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

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)


mysql> USE nodejs
Database changed

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


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

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)

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

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

Erstellen Sie die Startdatei des Knotenprogramms: app.js

Erster Test

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

Knoten ausführen

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

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

Konsolenausgabe:

D:\workspace\javascript\nodejs-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 (中国标准时间) }

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

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

Konsolenausgabe:

D:\workspace\javascript\nodejs-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 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

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. Falsches Simulationspasswort

Passwort ändern: „nodejs11“

Konsolenausgabe.

D:\workspace\javascript\nodejs-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. 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
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)

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)

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

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

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' } ]

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

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' } ]

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

Stellungnahme:
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