node连接数据库需要安装一个插件“mysql”

npm i mysql

安装完毕后我们需要引入这个插件,并且配置数据库的基础信息:

const mysql = require("mysql");

mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "123456",
    database: "node"
});

host为连接地址,本地就写localhost
user为数据库用户名
password为用户密码
database为数据库的名字

数据库配置完毕后,我们需要对数据库的数据进行获取,这里就需要使用query方法。

mysql.query("INSERT INTO user_table (user,pass,age) VALUES('mu','123456',18)", (err, data) => {
    if (err) {
        console.log(err);
    } else {
        console.log(data);
    }
});

query的第一个参数为sql语法,第二个为回调函数,回调函数有两个参数,第一个err为错误信息,第二个为data,成功后返回给你的数据。

sql注入

一般情况下,我们对数据库写入的信息都是需要动态获取的,并不是写死的,所以有可能会这样写:

const user = "mu",
    pass = "123456",
    age = 18;

mysql.query(`INSERT INTO user_table (user,pass,age) VALUES(${user},${pass},${age})`, (err, data) => {
    if (err) {
        console.log(err);
    } else {
        console.log(data);
    }
});

使用es6的语法,将变量传到字符里,但是这样会带来一个问题,如果对方提交的内容也是sql语法,这就会导致恶意代码破坏你数据库,这就是sql注入攻击了。

解决办法也有,我们可以使用占位字符的方式,让对方sql语法不和我们后台语法混在一起。

const user = "mu",
    pass = "123456",
    age = 18;

mysql.query(`INSERT INTO user_table (user,pass,age) VALUES(?,?,?)`, [user, pass, age], (err, data) => {
    if (err) {
        console.log(err);
    } else {
        console.log(data);
    }
});

query里面的参数,全部用?问好代替,在第二个参数传一个数组,数组里面依次存放对应的变量数据,第三个才是回调。

这样我们的语法不会被提交上来的数据影响。

连接池

我们之前连接数据库使用的是createConnection方法,这种方法其实并不是很好,因为他是一个单线程,也就是如果有两个用户,他们没办法同时一起获取数据,必须要等第一个用户连接服务器获取数据后,才能进行第二个。

所以有了一个想法,一开始我们就开多个连接在那,有需要就拿去一个,用完了再还回来,这样既能支持多个同时,也能减少用户等待上一位的请求等待时间。

这样的方式叫连接池

我们将连接方法改为:

mysql.createPool({
    host: "localhost",
    user: "root",
    password: "123456",
    database: "node"
});

这样就行了。

连接池默认是10个连接,一般不用改这个配置,如果需要改,你可以给配置对象如下:

mysql.createPool({
    host: "localhost",
    user: "root",
    password: "123456",
    database: "node",
    connectionLimit: 15
});

connectionLimit可以配置连接数量,一般不建议太少,也不能太多

异步数据库

即便是使用了连接池,mysql性能也不能说是最好的,于是有了异步的mysql

安装插件:promise-mysql

npm i promise-mysql
const mysql = require("promise-mysql");

(async () => {
    let db = await mysql.createPool({
        host: "localhost",
        user: "root",
        password: "123456",
        database: "node",
        connectionLimit: 15
    });

    await db.query("UPDATE user_table SET name=? WHERE ID=1")

})()

由于是异步操作,我们使用async将异步语法改为同步语法,所有的数据库查询都是异步,我们可以使用awite。

分类: Node 标签: nodesqlkoa

评论

暂无评论数据

暂无评论数据

目录