木灵鱼儿
阅读:1058
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。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。
相关推荐
node npm yarn 如何同时运行多个指令
node的bash命令其实是有对应的指令字符的,但是,这个指令只能再linux,mac上才有生效,再windows是无效的,所以了解一下就行。命令说明&&顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令&并行执行多条命令||顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令|管道符windows上进行多命令"scripts": { "dev": "cross-env NODE_ENV=development webpack --env development --progress -...
koa教程2 HttpBearerAuth 传递token
前端发送token到后端,一般有三种方式:链接中携带token,query参数post这种请求body中携带token头信息携带token但是事实上http已经为我们提供了传token的方式,是一个相对来说比较安全的方式,就是HttpBearerAuth 其实他也是一个头信息来着,只是相对来说多了一点操作,在apipost软件中,我们可以直接可视化设置如果是axios,则是需要添加一个头信息:axios({ method: 'get', url: url, responseType: 'blob', headers: { 'Authoriz...

koa教程2 微信openid登录
微信的openid,前端登录时,会发送一个code码到后端,后端接收到这个code,然后配合appid、appsecret参数,像wx发送一个get请求。wx的请求地址:GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code具体查看文档:微信官方文档-服务端可以看到这段get请求有四个参数:属性类型默认值必填说明appidstring 是小程序 appIdsecretstring 是...
koa教程2 权限分级控制
在之前的代码中,我们使用了一个scope属性来表示用户的权限,但是scope是一个数字,他的阅读性是非常差的,当其他人开发的时候,可能并不知道你这个数字是什么意思?所以,我们需要将它转义成文本。为了方便判断,我们在enum.js中增加一个用户等级的对象enum.js://通用判断是否存在该类型 function isThisType(val) { let flag = false; Object.keys(this).find(key => { if (this[key] === val) { return flag = true; } })...
koa教程2 token鉴权
之前我们在token中传入我们的自定义参数,现在我们要做一个token鉴权,很简单,如果他的token合法,就可以访问这个路由,如果不合法,就打回。这个也不能说是真正意义上的鉴权,因为他还没有判断scope值,所以只能说是简单判断。做这个判断我们就可以通过中间件的形式,于是我们在middlewares目录下创建一个auth.js文件auth.js:const parseBearerToken = require("@utils/paresBearerToken"); const jwt = require("jsonwebtoken"); cons...
koa教程2 用户登录
登录类型用户注册之后,自然是用户登录,登录的时候我们需要考虑到登录的方式,往往在正式的项目里面,登录的方式可能会有很多种:账号密码登录手机号登录小程序一键登录那么我们登录的时候就要进行判断,设置一个type的属性,用于在登录时判断用户是什么类型的登录,这个由前端那边设定参数。type:1为账号密码登录,2为手机号登录,3为小程序一键登录作为判断,我们可以写一个查询表(枚举),在项目根目录创建一个lib目录,在里面创建一个enum.js文件。enum.js://通用判断是否存在该类型 function isThisType(val) { let flag = false; Obje...
node 自定义路径别名
用过vue cli的话,对路径中的@应该不陌生,他表示根目录,但是在node的环境里面,我们编写模块并引入时,并没有这种方便的写法。在node环境中,我们可以通过process.cwd()来表示根目录,但是这样的话,每次使用绝对路径引入,路径总是需要写一大堆拼接。const db = require(`${process.cwd()}/config/config`).database;这样略显麻烦,于是我们可以在全局写一个引入插件的方法:global.myRequire = function (path) { return require(`${process.cwd()}/${pa...
koa教程2 密码加密
默认情况下,我们通过User.create({ email, password, nickname });模型传入的数据,是无加密的,也就是说,在数据库中密码是明文显示的,这样肯定是不行,我们需要使用bcrypt插件进行加密yarn add bcryptjs --dev打开models/user.jsuser.js:const bcrypt = require("bcryptjs"); const { sequelize } = require(`${process.cwd()}/core/db`); const { Sequelize, Model, DataTy...

koa教程2 使用sequelize连接数据库,创建用户模型
数据库的连接处理,我们需要使用sequelize插件。这个插件还有对应的数据库驱动,如果是使用mysql,那么驱动是mysql2,具体可以查看中文版的入门教程:入门yarn add sequelize mysql2 --dev安装完成后我们先需要创建数据库连接。连接数据库在根目录/core目录**下创建一个db.js文件用于连接数据库。在连接数据库之前,我们需要一些数据库的参数,如账号,密码,端口,数据库名字,数据库地址,为了方便管理配置,我们在根目录创建一个config目录,里面存放一config.js文件 ,这个之前的教程我们就已经创建好了。config.js:module.expo...
koa教程2 用户注册及Joi校验、成功信息返回
用户注册用户数据表搭建完毕后,我们肯定是需要注册用户的,那么首先我们需要创建一个路由api了。在根目录:/app/router/v1目录下创建一个user.js文件。user.js:const Router = require("koa-router"); const router = new Router({ prefix: "/v1/user" }); const { User } = require(`${process.cwd()}/models/user`); //注册用户 router.post("/register&q...
