木灵鱼儿
阅读:1619
koa教程2 使用sequelize连接数据库,创建用户模型
数据库的连接处理,我们需要使用sequelize
插件。这个插件还有对应的数据库驱动,如果是使用mysql,那么驱动是mysql2
,具体可以查看中文版的入门教程:入门
yarn add sequelize mysql2 --dev
安装完成后我们先需要创建数据库连接。
连接数据库
在根目录/core目录**下创建一个db.js
文件用于连接数据库。
在连接数据库之前,我们需要一些数据库的参数,如账号,密码,端口,数据库名字,数据库地址,为了方便管理配置,我们在根目录创建一个config目录,里面存放一config.js
文件 ,这个之前的教程我们就已经创建好了。
config.js:
module.exports = {
//dev、prod
env: "dev",
//数据库配置
database: {
dbName: "koa-test", //数据库名
host: "localhost", //数据库地址
port: 3306, //数据库端口
user: "root", //数据库用户名
password: "123456", //数据库密码
}
};
这样数据库的变动到时候只需要修改config里面的配置信息即可。
然后我们打开db.js,开始连接数据库
db.js:
const Sequelize = require("sequelize");
const {
dbName,
host,
port,
user,
password
} = require(`${process.cwd()}/config/config`).database;
const sequelize = new Sequelize(dbName, user, password, {
dialect: "mysql", //声明数据库类型
host,
port,
logging: true, //开启每次使用控制台提示sql语法
timezone: "+08:00", //设置时区
});
sequelize.sync();
module.exports = {
sequelize
}
其中除了config中的数据库参数,我们还需要使用dialect声明数据库类型。
logging表示是否在控制台显示sql语法,用于每次改变数据库时所用到的sql语句,一般开发的时候使用,值为布尔值,默认是true,也就是开启。
由于Sequelize在操作数据库的时候,会生成时间戳,所以我们需要指定他的时区。
sequelize.sync();
则表示模型同步,用于后面创建模型后,将模型的配置同步到数据上。他还有一些参数,后续再说。
最后我们导出这个new出来的Sequelize实力。后续在模型中我们需要用到这个实例,不然模型不知道修改那个数据库。
创建模型
已创建用户的数据表来说,他需要一下参数:
- id
- password
- openid
id为数据库的id序号,自增的,email作为用户账号使用,密码就不多少了,openid作为微信常用的一个字段,这里也演示一些,但是后续才会填充内容。
微信的openid表示的是当前这个小程序的微信用户唯一的id值,但是两个小程序,同一个用户openid是不一样的,所以微信还有一个全局唯一id,具体自行百度。
知道我们需要的字段后,我们就需要创建了
根目录创建一个models目录,里面创建一个user.js
文件。
user.js:
const { sequelize } = require(`${process.cwd()}/core/db`);
const { Sequelize, Model, DataTypes } = require("sequelize");
class User extends Model {
};
User.init({
id: {
type: DataTypes.INTEGER,
primaryKey: true, //主键
autoIncrement: true, //自增
},
nickname: DataTypes.STRING,
email: {
type: DataTypes.STRING(128),
unique: true, //唯一
},
password: DataTypes.STRING,
openid: {
type: DataTypes.STRING(64),
unique: true, //唯一
},
}, {
sequelize,
tableName: "user", //指定生成的表名
});
module.exports = {
User
}
继承Model,创建一个自己的模型对象,使用init方法进行扩展,他接受两个参数,第一个参数我们需要创建的字段数据,第二个是一些配置参数,其中有一个sequelize
参数用于关联对应的数据库,这里我们就将之前导出的sequelize实例用在此处。
模型默认创建的数据库表名为你创建的模型名字,也就是上面的User
,如果我们要指定的话,可以使用tableName属性,填写一个自定的表名。
最后我们再将自定义的模型对象导出,后续数据的控制,都是通过该模型来进行操作。
模型其他内容
在连接数据库的时候,我们有一句sequelize.sync();
语法,用于同步模型,我们来了解下他的意思。
User.sync()
- 如果表不存在,则创建该表(如果已经存在,则不执行任何操作)User.sync({ force: true })
- 将创建表,如果表已经存在,则将其首先删除User.sync({ alter: true })
- 这将检查数据库中表的当前状态(它具有哪些列,它们的数据类型等),然后在表中进行必要的更改以使其与模型匹配.
我们在开发阶段,可以将force: true
开启,这样方便我们增减字段,当然,他很危险,因为他会删除整个表重新创建,所以,如果已经有数据了,可以关闭,或者使用alter
db.js:
const Sequelize = require("sequelize");
const {
dbName,
host,
port,
user,
password
} = require(`${process.cwd()}/config/config`).database;
const sequelize = new Sequelize(dbName, user, password, {
dialect: "mysql", //声明数据库类型
host,
port,
logging: true, //开启每次使用控制台提示sql语法
timezone: "+08:00", //设置时区
});
sequelize.sync({
force: true
});
module.exports = {
sequelize
}
模型默认会给我们增减两个字段,一个是createdAt
,另一个是updatedAt
用于表示创建时间和更新时间,当我们通过模型去修改数据的时候,会自动更新这两个字段的值。
在数据库中,字段的命名不建议使用驼峰命名,一般是建议使用下划线,Sequelize 也提供了对应的设置方法,并且我们还可以增加一个字段deleted_at
,用于表示软删除的时间。
使用方法也是在连接数据库的时候,做的配置
db.js:
const Sequelize = require("sequelize");
const { dbName, host, port, user, password } = require(`${process.cwd()}/config/config`).database;
const sequelize = new Sequelize(dbName, user, password, {
dialect: "mysql", //声明数据库类型
host,
port,
logging: true, //开启每次使用控制台提示sql语法
timezone: "+08:00", //设置时区
define: {
timestamps: true, //是否自动创建时间戳
paranoid: true, //是否开启删除时间戳字段,默认false
// createdAt: "created_at",
// updatedAt: "updated_at",
// deletedAt: "deleted_at",
underscored: true, //所有驼峰写法改为下划线写法
}
});
sequelize.sync({
force: true, //每次都重建数据表
});
module.exports = {
sequelize
}
在define中,createdAt、updatedAt、deletedAt是用于改写字段名的,但是我们并不需要大的修改,只是将驼峰改为下划线,所以可以直接使用underscored: true
表示所以的驼峰改为下划线。
然后timestamps: true
表示是否自动创建时间戳,默认为true,如果改为false,那么createdAt、updatedAt、将不会被创建。
paranoid: true
用于表示是否创建deletedAt字段,默认是false。
这样我们的一个数据模型是创建好了。
此时我们并没有使用到这个模型,所以测试有没有效果,我们可以在app.js文件中直接require("./models/user")
;然后查看数据库是否已经创建的user表。
至此,我们一个简单的注册用户模型创建完毕。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。
相关推荐
centos 安装最新版 node.js
[hide]先用yum 安装一次node先升级yum update 提示下载程序,回复y安装nodeyum install nodejsyum安装的node一般都不是最新的,所以我们还需要升级node的版本npm i n -g全局安装一个n插件n lts表示安装最新的稳定版!一些常用命令n ls查看已安装的node版本n rm 16.0.3删除16.0.3版本更多功能阅读插件文档:n等待安装完毕后,此时其实版本已经安装好了,但是输入node -v还是低版本,是因为centos的用户缓存问题。我们退出登录再登录就会刷新缓存了,此时的node -v输出的就是最新版本exit 退...
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 用户注册及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...
