koa框架8 基础入门之数据库
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。
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据