node如何连接mysql?

本文介绍了如何在Node.js环境中连接MySQL数据库,包括从安装MySQL、安装node-mysql模块,到建立连接、执行SQL语句、处理多语句及使用连接池的方法。特别强调了在实际开发中使用连接池的重要性,以及防止SQL注入的安全措施。

mysql是一种关系型数据库,实际使用场景比较广泛。
如何用node连接mysql呢?

1、安装mysql。

大家可以在oracle官网去下载mysql软件,如果是windows系统,最简便的办法是下一个appserv,这是一个php的集成包,里面集成了mysql,一键安装即可,省却一大堆不必要的麻烦。

2、安装node支持mysql的模块。
npm install mysql -S
3、建立连接。

建立连接有两种方式,一种是创建连接对象,一种是创建连接池。
先说创建对象——createConnection,这种方式会建立一个表示与mysql连接的实例对象:

const mysql = require('mysql')
//创建连接
const conn = mysql.createConnection({
    host: 'localhost',
    port: 3306,
    user: 'root',
    password: 'root',
    database: 'mydb'
})
//连接mysql
conn.connect((err) => {
    if (err) {
        console.log(err)
        return;
    }
    console.log('success')
})
//关闭对象,end相当于flush,destroy是强制退出。
conn.end(err=>{
    console.log(err)
})
//conn.destroy()

但在实际web开发中,我们更多的会使用连接池——createPool。
连接池可以理解为一个数组,数组里面的成员就是上面创建的数据库连接实例对象。因为建立一个数据库连接所消耗的内存成本是非常高的,我们不可能为每一个客户端请求都建立一个数据库连接,这样会很快把内存吃满。
因此,我们通常会创建一个连接池,我们可以将数据库连接缓存在连接池当中,如果接收到下一个客户端请求时,可以从连接池中拿出之前的连接对象继续用,而不用再重新建立了。

const mysql = require('mysql')
//创建连接
const pool = mysql.createPool({
    host: 'localhost',
    port: 3306,
    user: 'root',
    password: 'root',
    database: 'mydb'
})
//getConnection就是直接从连接池拿出一个实例来用
pool.getConnection((err,conn)=> {
    if (err) {
        console.log(err)
        return;
    }
    //conn.release()//当连接不再使用时,release将其归还到连接池中,但这个方法不好使!
    pool.releaseConnection(conn)//正解:将连接不再使用时,将其归还到连接池
})
pool.end()//关闭连接池

注意:
官方文档的conn.release()并无法释放到连接池中,导致访问达到连接数上限后,pool.getConnection无法获取连接导致卡死!
因此,这里需要改成:pool.releaseConnection(conn)才能生效。
mysql默认连接数一般是100个左右,我们可以通过以下命令查询当前的mysql连接数,如果出现大量的sleep,那就要注意了。

mysql> show full processlist; 

也可以通过表查询获取:

mysql> show status like  'Threads%';

当然,mysql默认连接时间是1小时,如果是小访问量的网站,连续访问的间隔时间较长的话,连接会自动释放掉,可能看不出什么问题,但并发量一上来就出问题了。

4、执行sql语句。

这里要注意的是sql注入问题。sql注入的原理是黑客在提交给服务器的数据中带有sql语句,如果我们不做过滤,就会执行这些恶意的sql语句,导致数据库遭受攻击。
好在mysql模块提供了好用的escape()函数,可以帮我们过滤提交的数据。

const mysql = require('mysql')
//创建连接
const conn = mysql.createConnection({
    host: 'localhost',
    port: 3306,
    user: 'root',
    password: 'root',
    database: 'mydb'
})
//连接mysql
conn.connect((err) => {
    if (err) {
        console.log(err)
        return;
    }
    console.log('success')
})

let sql = 'select * from users where userid='+conn.escape(userid)
conn.query(sql,(err,rows)=>{
    if(err){
        console.log(err)
    } else {
        console.log(rows)
    }
})

还有一种常用的方案,就是用占位符。

const mysql = require('mysql')
//创建连接
const conn = mysql.createConnection({
    host: 'localhost',
    port: 3306,
    user: 'root',
    password: 'root',
    database: 'mydb'
})
//连接mysql
conn.connect((err) => {
    if (err) {
        console.log(err)
        return;
    }
    console.log('success')
})

let sql = 'select * from users where userid=?'//?代表占位
conn.query(sql,[userid],(err,rows)=>{
    if(err){
        console.log(err)
    } else {
        console.log(rows)
    }
})
5、多语句。

这种情况比较常见。比如一个首页,通常会有多张表查询的结果拼装后展示的。

const mysql = require('mysql')
//创建连接
const conn = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'mydb',
    //这一功能打开以后,就可以同时使用多条查询语句
    multipleStatements: true
})
//连接mysql
conn.connect((err) => {
    if (err) {
        console.log(err)
        return;
    }
    console.log('success')
})

let sql = 'select * from users where userid='+conn.escape(userid)
let sql2 = 'select * from news'
conn.query(`${sql};${sql2};`,(err,rows)=>{
    if(err){
        console.log(err)
    } else {
        console.log(rows[0])
        console.log(rows[1])
    }
})
conn.end(err=>{
    console.log(err)
})
//conn.destroy()
6、共享连接池

我们在正式使用时,需要将连接池pool对象导出,后面都是共享这一个pool对象。
导出:

let mysql = require('mysql')

module.exports = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'mydb',
    //这一功能打开以后,就可以同时使用多条查询语句
    multipleStatements: true
})

使用:

let pool = require('../conf/pool')
//从连接池拿出mysql实例对象
pool.getConnection((err,conn)=> {
    if (err) {
        console.log(err)
        return;
    }

    let sql = 'select * from users where userid='+conn.escape(userid)
    let sql2 = 'select * from news'
    conn.query(`${sql};${sql2};`,(err,rows)=>{
        if(err){
            console.log(err)
        } else {
            console.log(rows[0])
            console.log(rows[1])
        }
    })

    pool.releaseConnection(conn)//将连接实例归还回连接池
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值