引用QQ群-Javascript高级爬虫-作者自建群,欢迎加入!awesome-java-crawler-作者收集的爬虫相关工具和资料一个帮你自动创建阿里云抢占实例并开启网络加速的脚本-自动创建阿里云海外抢占节点在CentOS上安装node.js二进制发布包-CentOS安装最新版nodejsmysql2库github仓库地址mysql库github仓库地址前言为什么要用mysql2而不是经典的mysql库?主要有以下几个原因:更高的性能!支持PreparedStatement,多查询性能更高,写SQL更轻松;自带Promisewrapper,可以直接使用async/await语法;大多数API都兼容mysql库,这意味着mysql文档和在线资料也可以作为参考。基本用法installnpminstallmysql2连接数据库constconn=awaitmysql.createConnection({host:'xxxxxxxxxxxxxx.mysql.rds.aliyuncs.com',user:'<数据库用户名>',password:'<数据库密码>',database:'',charset:'utf8mb4'})这里的字符集使用utf8mb4,这样可以支持emoji字符。查询示例const[rows,fields]=awaitconn.query('SELECT*FROM`user`whereidin(?)',[userIds])插入示例const[rs]=awaitconn.query('insertinto`user`values(0,?,?,?,now())',[name,password,email])constid=rs.insertId//获取自增ID,预生成SQL语句constsql=conn.format('select*from??where??=?',['group','key',id])const[[user]]=awaitconn.query(sql)基于PrepareStatement的查询const[rows]=awaitconn.execute('SELECT*FROM`user`whereid=?',[userId])解释:query和execute的返回值是一对数据,即查询结果集数组,结果setmetadata,可以在rows[n].name中使用,直接引用结果集中的数据。query和execute的区别在于query完全在节点端为你组装SQL,而execute可以利用MySQL的PrepareStatement机制预编译SQL语句。execute的好处是数据库原生支持的预编译机制,性能更高。查询的好处是比较灵活,包括:可以用??替换表名、字段、索引名等,并自动添加反引号'?'组装SQL时。参数支持数组、对象等,即可以在in子句中使用,见上面查询示例高级特性连接池创建连接池参数与createConnection基本一致,增加了一些池化控制参数;详情请参考mysql库文档。constpool=mysql.createPool({...})进程退出时自动关闭连接池process.on('exit',async(code)=>{try{awaitpool.end()}catch(e){}})简单的使用pool.query(...)和pool.execute(...),相当于从池中获取连接,然后执行查询事务的基本步骤:从中获取连接连接池开启事务执行更新(和查询)提交事务返回连接示例如下:constconn=awaitpool.getConnection()awaitconn.beginTransaction()const[rows]=awaitconn.execute('select*from`activity`whereclaimed_byisnullorderbyidlimit1forupdate')if(rows.length>0){constcode=rows[0].codeawaitconn.execute('update`activity`setclaimed=?,claimed_by=?whereid=?',[newDate(),openid,rows[0].id])msg??=`恭喜!成功抢到礼品卡!\n兑换码为:${code}\n`}else{msg='抱歉,本次活动奖品全部用完!请继续关注下一个活动!'}sendMsg(msg)awaitconn.commit()conn.release()数据转码mysql/mysql2提供escape函数将javascript数据转码成SQL接受的格式,特别是用户输入的数据,必须转码后插入数据库处理以防止SQL注入攻击。escape会自动将各种原生数据转换为mysql接受的数据类型,包括:字符串自动加单引号,字符串中的特殊字符(尤其是单引号)自动转义,Date类型转换为'YYYY-mm-dd等HH:ii:ss'格式的字符串数组自动转换为逗号分隔的字符串,例如:['a','b']转换为'a','b'undefined/null转换为NULL