之前我们有讲过koa操作MongoDB的相关内容,今天我们来看一下koa操作MySQL的相关内容。
之前在Flask学习时使用的一直是ORM,所以这次,恩还是使用ORM,真香。
与SQLAlchemy相近的,在Node.js里面,sequelize是相当热门的工具,为了使用sequelize,几个必要条件是必须的:
"mysql2": "^1.7.0",
"sequelize": "^5.19.0"
首先是上面两个,我直接复制了package.json中的内容,这个不必多说,其次是大家尽量不要使用MySQL8.0的版本,血的教训,MySQL8.0使用sequelize连接的时候会报错。
因此使用一个5.7版本的MySQL刚刚好。因为个人在波兰,访问阿里服务器里面的数据库着实很慢,这里使用本地的数据库来操作。连接的demo如下:
const Sequelize = require('sequelize');
const sequelize = new Sequelize('koad', 'root', '****', {
host: '127.0.0.1',
dialect: 'mysql'
});
sequelize
.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
process.exit();
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});
其中koa和sequelize还支持连接池的默认设定:
由于建立数据库连接存在成本, 所以通常情况下会通过连接池来提升数据库的连接效率,以避免每次执行数据库操作时重复建立连接。 Sequelize默认支持连接池 ,可以在创建连接时指定 pool 参数来修改默认的连接池。
代码结构安排的很简单,然而过程中遇到了很多的问题,因为我目前使用的最新版的sequelize:5,网上的一些例子都是错误的,因为在4升级到5的时候还是有不少改动的.
先看结构:
这里只提一下data.js,在这里存放sequelize的代码:
const Sequelize = require('sequelize');
const sequelize = new Sequelize('koad', 'root', '****', {
host: '127.0.0.1',
dialect: 'mysql'
});
const User = sequelize.define('user',{
name: Sequelize.STRING
})
User.sync({false:true})
async function CreateUsers(user) {
return User.create(user)
}
async function SearchUserById(id) {
return User.findByPk(id)
}
module.exports = {
CreateUsers,
SearchUserById
}
简单解释一下,首先是设计一个数据表,名字的话也不知道为嘛会在"user"后面加个"s",怎么说呢,其实也正常,还算挺贴心的设定,不过不知道会不会产生啥错误.
接着表有一个字段,叫做name,主键id,还会附带两个其他属性:
+----+------+---------------------+---------------------+
| id | name | createdAt | updatedAt |
+----+------+---------------------+---------------------+
| 1 | shan | 2019-09-25 21:12:37 | 2019-09-25 21:12:37 |
+----+------+---------------------+---------------------+
当然也可以修改名字或者禁用这两个附加字段.
接着就是创建数据表,"false:true"的设定可以让表强制更新, 最后设计了两个函数,一个创建数据,一个返回指定属性的数据,并把这两个数据暴露出来.
这里有个改动,在seq4中我们把"findByPk"写作"findById",这个写法已经过时了,在seq5中不存在.
接着按照创建好的函数走,是我们的help.js:
const { SearchUserById, CreateUsers} = require('./data')
module.exports = {
findById : async (ctx)=>{
const user = await SearchUserById(ctx.params.id);
ctx.body = {
status: 0,
data: user
}
},
createUser : async (ctx)=>{
const user = ctx.request.body
await CreateUsers(user)
ctx.body = {
status: 0
}
}
};
对路由处理的函数做了分离并处理,这里是和seq4有很大不同的地方,首先是seq4要手动设定json类型:
context. type = jsonMIME ;
这个方法在seq5里面已经不存在了.我们也不需要做多余的设计.
接着看路由:
const Router = require('koa-router')
const {createUser, findById} = require('./help')
const router = new Router({
prefix:"/api"
});
router.post('/user',createUser)
router.get('/user/:id', findById)
module.exports = router
中规中距,没啥要说的.
app.js也没什么好看的,之贴出来代码:
const koa = require('koa');
const router = require('./router')
const app = new koa();
app.use(router.routes());
app.listen(3000,()=>{
console.log('run in http://localhost:3000')
});
接着用postman试一下即可:
贴个图即可,怎么测试大家应该知道,不知道的话恶补一下http等等等知识吧.
总结一下,由于seq5的出现,我在做这个demo的时候其实是有点吃力的,因为很多东西都改过了,大家不要像我这样去找书,还是应该看官方手册,某些高分书可能在一些地方有独到的见解,但奈何时间不等人啊.