Koa学习笔记 --sequelize

之前我们有讲过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的时候还是有不少改动的.

先看结构:

Koa学习笔记 --sequelize_第1张图片

这里只提一下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试一下即可:

Koa学习笔记 --sequelize_第2张图片

贴个图即可,怎么测试大家应该知道,不知道的话恶补一下http等等等知识吧.

总结一下,由于seq5的出现,我在做这个demo的时候其实是有点吃力的,因为很多东西都改过了,大家不要像我这样去找书,还是应该看官方手册,某些高分书可能在一些地方有独到的见解,但奈何时间不等人啊.

你可能感兴趣的:(Node.js,学习日记)