Maison > interface Web > js tutoriel > Tutoriel sur la configuration de l'environnement Windows+Node.js+MySQL via node-mysql_node.js

Tutoriel sur la configuration de l'environnement Windows+Node.js+MySQL via node-mysql_node.js

WBOY
Libérer: 2016-05-16 15:12:40
original
2220 Les gens l'ont consulté

Avant-propos

MySQL est un produit de base de données open source couramment utilisé et constitue généralement le premier choix pour les bases de données gratuites. J'ai vérifié la liste NPM et découvert que Nodejs dispose de 13 bibliothèques pouvant accéder à MySQL felixge/node-mysql semble être le projet le plus populaire, j'ai donc décidé de l'essayer.

Faites attention au nom, "felixge/node-mysql" n'est pas "node-mysql", cet épisode sera introduit dans la partie installation !

Table des matières

  • introduction à node-mysql
  • Créer une bibliothèque de tests MySQL
  • Installation nœud-mysql
  • Utilisation de node-mysql

1.Introduction à node-mysql

felixge/node-mysql est un programme client MySQL implémenté en nodejs pur en utilisant javascript. felixge/node-mysql encapsule les opérations de base de Nodejs sur MySQL, licence publique 100% MIT.

Adresse du projet : https://github.com/felixge/node-mysql

2. Établir une bibliothèque de tests MySQL

Créer une bibliothèque de tests MySQL localement : 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)

Copier après la connexion
mysql> GRANT ALL ON nodejs.* to nodejs@'%' IDENTIFIED BY 'nodejs';
mysql> GRANT ALL ON nodejs.* to nodejs@localhost IDENTIFIED BY 'nodejs';
Copier après la connexion

Connectez-vous à nouveau à MySQL

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

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

Copier après la connexion


mysql> USE nodejs
Database changed
Copier après la connexion

Créer une nouvelle table utilisateur

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);
Copier après la connexion


mysql> SHOW TABLES;
+------------------+
| Tables_in_nodejs |
+------------------+
| t_user      |
+------------------+
1 row in set (0.04 sec)
Copier après la connexion

3. Installation nœud-mysql

Mon environnement système

win7 64 bits
Nodejs :v0.10.5
Npm:1.2.19
MySQL : Version du serveur : 5.6.11 MySQL Community Server (GPL)
Créer un projet : 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)
Copier après la connexion

Voici un petit épisode

Après avoir installé "node-mysql", ouvrez le fichier package.json et constatez que l'adresse du projet est

https://github.com/redblaze/node-mysql.git
Comme vous pouvez le voir d'après la relation de dépendance, cela dépend de la bibliothèque mysql et est une encapsulation de felixge/node-mysql.

noeud-mysql1

Puisque l'étoile de ce projet est 0, le fork est également 0. Par conséquent, je ne vais pas passer du temps à le tester et à réinstaller le package felixge/node-mysql.

Réinstaller node-mysql

~ 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
Copier après la connexion

Ça y est cette fois, continuons le développement !

Créez le fichier de démarrage du programme de nœud : app.js

Premier test

~ vi app.js
Copier après la connexion
Copier après la connexion
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();

Copier après la connexion

Exécuter le nœud

~ D:\workspace\javascript\nodejs-node-mysql>node app.js
The solution is: 2
Copier après la connexion

De cette façon, nous laissons Nodejs se connecter à MySQL.

4. Utiliser node-mysql

Nous allons maintenant effectuer des tests communs sur l'API node-mysql.

Tableau nouveau, supprimé, modifié et vérifié
Configuration du pool de connexions
MySQL se déconnecte et se reconnecte
Test de délai d'attente du pool de connexion
1). Vérifier la nouveauté, la suppression et la modification du tableau
Modifier app.js

~ vi app.js
Copier après la connexion
Copier après la connexion
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();

Copier après la connexion

Sortie console :

D:\workspace\javascript\nodejs-node-mysql>node app.js
Copier après la connexion
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 (中国标准时间) }
Copier après la connexion

En raison de la nature asynchrone du nœud, ce qui précède est une opération continue et le code sera écrit par fragments. Nous pouvons encapsuler le code ci-dessus via la bibliothèque async, veuillez vous référer à l'article : Nodejs asynchronous process control Async

2). Configuration du pool de connexions

Ajouter un fichier : app-pooling.js

~ vi app-pooling.js

Copier après la connexion
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();
  });
});

Copier après la connexion

Sortie console :

D:\workspace\javascript\nodejs-node-mysql>node app-pooling.js
Copier après la connexion
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 (中国标准时间) }
Copier après la connexion

3). MySQL déconnecté et reconnecté

Simulez respectivement 3 types d'erreurs

a. Mot de passe de connexion incorrect
b. La base de données est en panne
c. Expiration du délai de connexion à la base de données
Nouveau fichier : app-reconnect.js

~ vi app-reconnect.js

Copier après la connexion
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();

Copier après la connexion

a. Mauvais mot de passe de simulation

Modifier le mot de passe : 'nodejs11'

Sortie console.

D:\workspace\javascript\nodejs-node-mysql>node app-reconnect.js
Copier après la connexion
Copier après la connexion
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 }
Copier après la connexion

b. Simuler les temps d'arrêt de la base de données
Démarrez le nœud normalement, puis tuez le processus mysqld.

Sortie console.


D:\workspace\javascript\nodejs-node-mysql>node app-reconnect.js
Copier après la connexion
Copier après la connexion
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)

Copier après la connexion

Cette exception provoque directement la suppression du programme de nœud !

c. Délai d'expiration de connexion simulé, PROTOCOL_CONNECTION_LOST
Passez au compte root, modifiez le paramètre wait_timeout de MySQL et définissez-le sur un délai d'attente de 10 millisecondes.

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

Copier après la connexion

Modifiez le fichier : app-reconnection.js et ajoutez du code à la fin

~ vi app-reconnection.js

Copier après la connexion
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);

Copier après la connexion

Le programme effectuera une requête toutes les 15 secondes.

Sortie console

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' } ]
Copier après la connexion

Notre propre programme a détecté l'exception "PROTOCOL_CONNECTION_LOST" et a automatiquement reconnecté la base de données.

4). Test de délai d'attente du pool de connexion MySQL

Pour le problème wait_timeout, testons à nouveau la connexion.

Modifier le fichier 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);
});

Copier après la connexion

Sortie console :

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' } ]
Copier après la connexion

Le pool de connexion a résolu le problème de la reconnexion automatique. Nous pouvons utiliser le pooling autant que possible dans nos développements ultérieurs.

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal