nodejs操作mysql数据库

前言

本文介绍了nodejs连接mysql数据库的一般操作方法

安装

npm install --save mysql

连接数据库

config:

1
2
3
4
5
6
7
mysql:{
host : 'db',
user : 'root',
password : 'password',
database : 'database',
host : 'localhost',
}

callback 版本

sqlconnect.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var mysql = require('mysql');
var config = require('../config').mysql;

config.connectionLimit = 50;
var pool = mysql.createPool(config);

var query = function(sql, params, callback) {
var cb = arguments[arguments.length-1];
var useparam = arguments.length == 3;
pool.getConnection(function (err, conn) {
if (err) console.log("POOL ==> " + err);
else {
if (useparam) {
conn.query(sql, params, function (err, vals, fields) {
//release connection
conn.release();
cb(err, vals, fields);
});
} else {
conn.query(sql, function (err, vals, fields) {
//release connection
conn.release();
cb(err, vals, fields);
});
}
}
});
};

module.exports= {query:query,pool:pool};

query.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
var sql = require('./sqlconnect');

module.exports = {
queryFunc: function (data, cb) {
sql.query('query string', data, function (err, vals) {
cb(err,vals);
})
},
transactonFunc: function (data, cb) {
sql.pool.getConnection( function (err, connection) {
if (err) {
...
connection.release();
cb(err);
} else {
connection.query('first query', data, function(err, vals1) {
if (err) {
return connection.rollback(function () {
connection.release();
callback(err, null);
})
}
const otherData = vals1[0];
connecton.query('another query', [...data, ...otherData], function(err, vals2) {
if (err) {
return connection.rollback(function () {
connection.release();
callback(err, null);
})
}
connection.commit(function (err) {
if (err) {
return connection.rollback(function () {
...
connection.release();
callback(err, null);
})
}
connection.release();
callback(null,vals2);
});
})
})
}
})
}
}

async/await 版本

sqlconnect.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const mysql = require('mysql');
const sqlConfig = require('../config').mysql;
sqlConfig.connectionLimit = 50;

const pool = mysql.createPool(sqlConfig);

const query = function(sql, params = []) {
return new Promise((resolve, reject) => {
pool.getConnection(function (err, conn) {
if (err) {
console.log("POOL ==> " + err);
reject(err);
return;
}
conn.query(sql, params, function (err, values, fields) {
//release connection
conn.release();
err?reject(err):resolve(values);
});
});
});
};

module.exports=query;

query.js:

1
2
3
4
5
6
7
8
const sql = require('./sqlconnect');

module.exports = {
queryFunc: async (data) =>{
const val = await sql('sql string', [...data]);
return val;
},
}

总结

两种方式都不是很理想。callback陷入了回调地狱,而async版本由于node-mysql库的限制,本人的能力有限,没有改写出promise。

之前在网上找了很久合适的mysql库,终于找到一个不错的nodejs的ORM库。见下一篇。