Подключиться к базе данных MySQL в NodeJS
1. Install MySQL Driver
Для начала вам нужно создать проект NodeJS, например здесь я создаю проект с названием NodeJSMySQL.
Далее вам нужно установить библиотеку MySQL для вашего проекта. Открыть окно CMD и CD к коренной папке проекта и выполнить команду ниже:
npm install mysql
After finishing the installation, a node_modules directory will be created on your project. This directory contains necessary libraries so that your application can connect to MySQL database:
2. Connect MySQL
В предыдущем шаге вы успешно создали проект и установили библиотеки MySQL для данного проекта. Теперь создайте маленький пример, подключите к базе данных MySQL. OK, создайте файл connection-example.js:
connection-example.js
var mysql = require('mysql');
console.log('Get connection ...');
var conn = mysql.createConnection({
database: 'mytestdb',
host: "localhost",
user: "root",
password: "12345"
});
conn.connect(function(err) {
if (err) throw err;
console.log("Connected!");
});
Запуск примера:
node connection-example.js
Error: ER_NOT_SUPPORTED_AUTH_MODE
При запуске примера выше, вы можете получить следущее оповещение ошибки:
** Error **
E:\NODEJS\NodeJSMySQL\node_modules\mysql\lib\protocol\Parser.js:80
throw err; // Rethrow non-MySQL errors
^
Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
at Handshake.Sequence._packetToError (E:\NODEJS\NodeJSMySQL\node_modules\mysql\lib\protocol\sequences\Sequence.js:52:14)
at Handshake.ErrorPacket (E:\NODEJS\NodeJSMySQL\node_modules\mysql\lib\protocol\sequences\Handshake.js:130:18)
at Protocol._parsePacket (E:\NODEJS\NodeJSMySQL\node_modules\mysql\lib\protocol\Protocol.js:279:23)
at Parser.write (E:\NODEJS\NodeJSMySQL\node_modules\mysql\lib\protocol\Parser.js:76:12)
at Protocol.write (E:\NODEJS\NodeJSMySQL\node_modules\mysql\lib\protocol\Protocol.js:39:16)
at Socket.<anonymous> (E:\NODEJS\NodeJSMySQL\node_modules\mysql\lib\Connection.js:103:28)
at emitOne (events.js:116:13)
at Socket.emit (events.js:211:7)
at addChunk (_stream_readable.js:263:12)
at readableAddChunk (_stream_readable.js:250:11)
--------------------
at Protocol._enqueue (E:\NODEJS\NodeJSMySQL\node_modules\mysql\lib\protocol\Protocol.js:145:48)
at Protocol.handshake (E:\NODEJS\NodeJSMySQL\node_modules\mysql\lib\protocol\Protocol.js:52:23)
at Connection.connect (E:\NODEJS\NodeJSMySQL\node_modules\mysql\lib\Connection.js:130:18)
at Object.<anonymous> (E:\NODEJS\NodeJSMySQL\connection-example.js:11:6)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
Причиной ошибки выше является то, что вы используете слишком новую базу данных MySQL (version >= 8.x). Старые версии MySQL (5.x) используют плагин аутентификации (authentication plugin) SHA256_PASSWORD. Версия MySQL 8.x использует плагин аутентификации SHA2_PASSWORD. Библиотека NodeJS MySQL еще не изменилась, она использует плагин аутентификации SHA256_PASSWORD, и пока не поддерживает SHA2_PASSWORD.
Release | General availability | Latest minor version | Latest release | End of support |
5.1 | 2008-11-14 | 5.1.73 | 2013-12-03 | December 2013 |
5.5 | 2010-12-03 | 5.5.60 | 2018-04-19 | December 2018 |
5.6 | 2013-02-05 | 5.6.40 | 2018-04-19 | February 2021 |
5.7 | 2015-10-21 | 5.7.22 | 2018-04-19 | October 2023 |
8.0 | 2018-04-19 | 8.0.11 | 2018-04-19 | N/A |
Чтобы исправить ошибку выше, откройте окно "MySQL Command Line Client" и выполните команду выше:
# Syntax:
ALTER USER 'my_username'@'my_host' IDENTIFIED WITH 'mysql_native_password' BY 'my_password';
# Example:
ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY '12345';
Вы так же можете создать объект Connection другим способом, как из connection_string:
** Create Connection from ConnectionString **
var connString = 'mysql://myuser:mypass@myhost/mdb?charset=utf8_general_ci&timezone=-0700';
var conn = mysql.createConnection(connString);
3. Examplle: query(sql, callback)
NodeJS MySQL API использует метод query чтобы выполнить все действия с базой данных включая:
- DDL: Create DB, Table, ...
- DML: Insert, Update, Query, Call Function, Procedure,...
** query method **
// query method:
query(sql, [values], callback)
// Example:
query(sql, [values], function(err, rows, fields) {
});
В примере ниже, мы подключаемся к базе данных MySQL и выполняем манипуляции с кодом:
- Drop таблицу EMPLOYEES если она есть.
- Пересоздать таблицу EMPLOYEES.
- Вставить некоторые записи (record) в таблицу EMPLOYEES.
first-example.js
var mysql = require('mysql');
var conn = mysql.createConnection({
database: 'mytestdb',
host: "localhost",
user: "root",
password: "12345"
});
conn.connect(function(err) {
if (err) {
throw err;
}
console.log("Connected!");
// Drop EMPLOYEES table if Exists!!
var sql1 = "DROP TABLE IF EXISTS Employees ";
conn.query(sql1, function(err, results) {
if (err) throw err;
console.log("Table EMPLOYEES dropped");
});
// Create EMPLOYEES Table.
var sql2 = "CREATE TABLE Employees " +
" (Id INT not null AUTO_INCREMENT, " +
" Emp_No VARCHAR(20), " +
" Full_Name VARCHAR(255), " +
" Hire_Date DATE, " +
" PRIMARY KEY (Id) )";
conn.query(sql2, function(err, results) {
if (err) throw err;
console.log("Table Employees created");
});
var empNos = ["E01", "E02", "E03"];
var fullNames = ["John", "Smith", "Gates"];
var hireDates = ["22/10/2001", "11/11/2000", "12/12/1990"];
// Insert Datas to EMPLOYEES.
for (var i = 0; i < empNos.length; i++) {
var sql3 = "Insert into Employees (Emp_No, Full_Name, Hire_Date) " //
+
" Values ('" + empNos[i] + "', '" + fullNames[i] + "', STR_TO_DATE('" + hireDates[i] + "', '%d/%m/%Y') )";
conn.query(sql3, function(err, results) {
if (err) throw err;
console.log("Insert a record!");
});
}
});
Запуск примера:
node first-example.js
Phương thức mysql.format(sql, replaces) giúp bạn chuẩn bị một mệnh đề SQL (SQL Statement), nó giúp bạn tạo ra một mênh đề SQL đơn giản và dễ nhìn hơn:
** mysql.format(sql_template, replaces) **
// Select * from EMPLOYEES where HIRE_DATE > STR_TO_DATE( '20/11/1995' , '%d/%m/%Y')
var sql_template = "Select * from ?? where ?? > STR_TO_DATE( ? , '%d/%m/%Y') ";
var replaces = ['EMPLOYEES', 'HIRE_DATE', '20/11/1995'];
sql = mysql.format(sql_template, replaces);
console.log("SQL="+ sql);
Ví dụ:
prepared-query-example.js
var mysql = require('mysql');
var conn = mysql.createConnection({
database: 'mytestdb',
host: "localhost",
user: "root",
password: "12345"
});
conn.connect(function(err) {
if (err) throw err;
console.log("Connected!");
// Select * from EMPLOYEES where HIRE_DATE > STR_TO_DATE( '20/11/1995' , '%d/%m/%Y')
var sql_template = "Select * from ?? where ?? > STR_TO_DATE( ? , '%d/%m/%Y') ";
var replaces = ['EMPLOYEES', 'HIRE_DATE', '20/11/1995'];
sql = mysql.format(sql_template, replaces);
console.log("SQL=" + sql);
console.log(" ************************ ");
conn.query(sql, function(err, rows, fields) {
if (err) throw err;
for (var i = 0; i < rows.length; i++) {
console.log("\n------ Row " + i + " ---- ");
console.log(rows[i]);
console.log("\n");
console.log(" - Emp_No: " + rows[i].Emp_No)
console.log(" - Full_Name: " + rows[i].Full_Name);
}
});
});
Data of rows:
[ RowDataPacket {
Id: 1,
Emp_No: 'E01',
Full_Name: 'John',
Hire_Date: 2001-10-21T17:00:00.000Z },
RowDataPacket {
Id: 2,
Emp_No: 'E02',
Full_Name: 'Smith',
Hire_Date: 2000-11-10T17:00:00.000Z } ]
Data of fields
[ FieldPacket {
catalog: 'def',
db: 'mytestdb',
table: 'EMPLOYEES',
orgTable: 'employees',
name: 'Id',
orgName: 'Id',
charsetNr: 63,
length: 11,
type: 3,
flags: 16899,
decimals: 0,
default: undefined,
zeroFill: false,
protocol41: true },
FieldPacket {
catalog: 'def',
db: 'mytestdb',
table: 'EMPLOYEES',
orgTable: 'employees',
name: 'Emp_No',
orgName: 'Emp_No',
charsetNr: 33,
length: 60,
type: 253,
flags: 0,
decimals: 0,
default: undefined,
zeroFill: false,
protocol41: true },
FieldPacket {
catalog: 'def',
db: 'mytestdb',
table: 'EMPLOYEES',
orgTable: 'employees',
name: 'Full_Name',
orgName: 'Full_Name',
charsetNr: 33,
length: 765,
type: 253,
flags: 0,
decimals: 0,
default: undefined,
zeroFill: false,
protocol41: true },
FieldPacket {
catalog: 'def',
db: 'mytestdb',
table: 'EMPLOYEES',
orgTable: 'employees',
name: 'Hire_Date',
orgName: 'Hire_Date',
charsetNr: 63,
length: 10,
type: 10,
flags: 128,
decimals: 0,
default: undefined,
zeroFill: false,
protocol41: true } ]
Pуководства NodeJS
- Введение в NodeJs
- Что такое NPM?
- Руководство NodeJS для начинающих
- Установить редактор Atom
- Установите NodeJS в Windows
- Руководство NodeJS Module
- Концепция Callback в NodeJS
- Создание простого HTTP Server с NodeJS
- Понимание Event Loop в NodeJS
- Руководство NodeJS EventEmitter
- Подключиться к базе данных MySQL в NodeJS
Show More