从零学习node.js之mysql数据库的操作(五)

2020-06-17 05:54:20易采站长站整理

connection

连接池中产生新连接时会发送’connection’事件:


pool.on('connection', function (connection) {
console.log('new connection');
});

3.3 QUERY与GETCONNECTION的区别

这两个方法都能进行操作,那么这两者有什么区别呢?

pool.getConnection
中的connection在其回调函数里是一直的,可以保证这一系列的操作都是在同一个connection中执行的;
pool.query
则每次执行时可能会在不同的connection中执行,可能会得到意想不到的结果。

比如

SQL_CALC_FOUND_ROWS
FOUND_ROWS
这需要两个sql语句完成,是获取检索行的数目。


pool.query('SELECT SQL_CALC_FOUND_ROWS * FROM `user`');
pool.query('SELECT FOUND_ROWS()');

这两个可能在不同的connection中执行,第2个sql语句返回的就不是上一个sql语句的结果了。

四、sql防注入

sql防注入的关键就是不能直接把数据拼接到sql语句中,必须得对数据进行转义,或者使用提供的方法拼接sql语句。这里主要有四种方法可以使用。

4.1 使用ESCAPE()对参数进行编码

参数编码方法有:

mysql.escape()/connection.escape()/pool.escape() 
,这三个方法可以在你需要的时候调用:


var sql = 'SELECT * FROM `user` WHERE `uid`='+connection.escape('"123";//--');
console.log(sql); // SELECT * FROM `user` WHERE `uid`='"123";//--'

connection.query(sql, function(err, result){
if(err) throw err;

console.log(result);
})

对双引号进行了安全转义。

escapeId()
可以对不信任的表名,字段名进行转义。


var sql = 'SELECT * FROM '+connection.escapeId('user')+' WHERE `uid`=1';
connection.query(sql, function(err, result){
console.log(result);
})
console.log(query.sql); // SELECT * FROM `user` WHERE `uid`=1

同时,

escape()
的编码规则如下:

Numbers不进行转换
Booleans转换为true/false
Date对象转换为’YYYY-mm-dd HH:ii:ss’字符串
Buffers转换为hex字符串,如X’0fa5′
Strings进行安全转义
Arrays转换为列表,如[‘a’, ‘b’]会转换为’a’, ‘b’
多维数组转换为组列表,如[[‘a’, ‘b’], [‘c’, ‘d’]]会转换为(‘a’, ‘b’), (‘c’, ‘d’)