nodejs連接mysql __veblen
一、安裝
npm install mysql
二、引入模塊,并連接mysql
var mysql = require('mysql'); //調用MySQL模塊
//創(chuàng)建一個connection
var connection = mysql.createConnection({
host : '127.0.0.1', //主機
user : 'root', //MySQL認證用戶名
password : 'abcd', //MySQL認證用戶密碼
port: '3306', //端口號
database: 'school', //數(shù)據(jù)庫名稱
});
//創(chuàng)建一個connection
connection.connect(function(err){
if(err){
console.log('[query] - :'+err);
return;
}
console.log('[connection connect] succeed!');
});
//執(zhí)行SQL語句
connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
if (err) {
console.log('[query] - :'+err);
return;
}
console.log('The solution is: ', rows[0].solution);
});
//關閉connection
connection.end(function(err){
if(err){
return;
}
console.log('[connection end] succeed!');
});
-
test->插入數(shù)據(jù)
var mysql = require('mysql');
var connection = mysql.createConnection({
host : '192.168.0.200',
user : 'root',
password : 'abcd',
port: '3306',
database: 'nodesample',
});
connection.connect();
var userAddSql = 'INSERT INTO userinfo(Id,UserName,UserPass) VALUES(0,?,?)';
var userAddSql_Params = ['Wilson', 'abcd'];
//增
connection.query(userAddSql,userAddSql_Params,function (err, result) {
if(err){
console.log('[INSERT ERROR] - ',err.message);
return;
}
console.log('--------------------------INSERT----------------------------');
//console.log('INSERT ID:',result.insertId);
console.log('INSERT ID:',result);
console.log('-----------------------------------------------------------------
');
});
connection.end();
從執(zhí)行結果可以看出,
result中包含一些有用的信息,affectedRows(受影響的行數(shù))insertId(插入的主鍵ID)等等。 有受影響的行數(shù)和插入數(shù)據(jù)的ID,就可以很方便進行后續(xù)的一些操作(比如判斷是否成功或者繼續(xù)根據(jù)插入數(shù)據(jù)的ID進行其它操作)
-
test->查詢數(shù)據(jù)
var mysql = require('mysql');
var connection = mysql.createConnection({
host : '192.168.0.200',
user : 'root',
password : 'abcd',
port: '3306',
database: 'nodesample',
});
connection.connect();
var userGetSql = 'SELECT * FROM userinfo';
//查
connection.query(userGetSql,function (err, result) {
if(err){
console.log('[SELECT ERROR] - ',err.message);
return;
}
console.log('--------------------------SELECT----------------------------');
console.log(result);
console.log('-----------------------------------------------------------------
');
});
connection.end();
從查詢出來的結果可以看出,
result返回了一個JSON格式的數(shù)據(jù)
三、結束數(shù)據(jù)庫連接兩種方法和區(qū)別
前面的示例中我在結尾處都會調用一個connection.end()方法,這個方法connection.connect()對應,一個開始,一個結束!
結束連接其實有兩種方法end(),destory();
end()
end()方法在queries都結束后執(zhí)行,end()方法接收一個回調函數(shù),queries執(zhí)行出錯,仍然后結束連接,錯誤會返回給回調函數(shù)err參數(shù),可以在回調函數(shù)中處理!
destory()
比較暴力,沒有回調函數(shù),即刻執(zhí)行,不管queries是否完成!
四、連接池Pooling connections(生產(chǎn)環(huán)境請使用連接池)
1.連接池的創(chuàng)建,使用createPool方法,options和createConntion一致,可以監(jiān)聽connection事件。
var mysql = require('mysql');
//創(chuàng)建連接池
var pool = mysql.createPool({
host : '192.168.0.200',
user : 'root',
password : 'abcd'
});
連接池可以直接使用,也可以共享一個連接或管理多個連接(引用官方示例)
//直接使用
pool.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
if (err) throw err;
console.log('The solution is: ', rows[0].solution);
});
//共享
pool.getConnection(function(err, connection) {
// connected! (unless `err` is set)
});
3.釋放
調用connection.release()方法,會把連接放回連接池,等待其它使用者使用!
var mysql = require('mysql');
var pool = mysql.createPool({
host : '192.168.0.200',
user : 'root',
password : 'abcd',
port: '3306',
database: 'nodesample'
});
pool.getConnection(function(err, connection) {
connection.query( 'SELECT * FROM userinfo;', function(err, result) {
console.log(result);
connection.release();
});
connection.query( 'SELECT * FROM userinfo;', function(err, result) {
console.log(result);
connection.release();
});
});
五、斷線重連
數(shù)據(jù)庫可以因為各種原因導致連接不上,這種就必須有重連接機制! 主要判斷
errorcode:PROTOCOL_CONNECTION_LOST
var mysql = require('mysql');
var db_config = {
host : '192.168.0.200',
user : 'root',
password : 'abcd',
port: '3306',
database: 'nodesample'
};
var connection;
function handleDisconnect() {
connection = mysql.createConnection(db_config);
connection.connect(function(err) {
if(err) {
console.log("進行斷線重連:" + new Date());
setTimeout(handleDisconnect, 2000); //2秒重連一次
return;
}
console.log("連接成功");
});
connection.on('error', function(err) {
console.log('db error', err);
if(err.code === 'PROTOCOL_CONNECTION_LOST') {
handleDisconnect();
} else {
throw err;
}
});
}
handleDisconnect();