上一篇:jwt登录鉴权获取token配置和示例地址
如果你没有安装Mysql数据库,先去安装再来学习
npm install --save egg-sequelize mysql2
同样在config/plugin.js文件中配置
module.exports = {
sequelize: {
enable: true,
package: 'egg-sequelize',
},
//权限验证插件
jwt: {
enable: true,
package: 'egg-jwt',
}
};
在config/config.default.js文件配置sequelize
module.exports = appInfo => {
//数据库配置
config.sequelize = {
// 数据库类型
dialect: 'mysql',
// host
host: '127.0.0.1',
// 端口号
port: '3306',
// 用户名
username: 'root',
// 密码
password: '123456',
// 数据库名
database: 'eggDatabase',
// 设置时区为东8区
timezone: '+08:00',
}
config.logger = {
level: 'DEBUG',
outputJSON: true,
encoding: 'utf-8',
consoleLevel: 'DEBUG',
};
//cors跨域配置
config.security = {
csrf: {
enable: false,
},
domainWhiteList: ['*'], //允许访问域名的白名单,*表示都能访问
};
config.cors = {
origin: '*',
allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS', //允许请求的方法
};
//jwt鉴权配置
config.jwt = {
secret: '123456', // token的加密的密钥,自己随便设置
};
return {
...config,
};
};
使用sequelize的orm模型创建数据表,不用去写麻烦的sql语句,也方便数据的结构的管理
在app/model/user.js文件里(先创建model文件夹)
module.exports = app => {
const {
STRING,
INTEGER
} = app.Sequelize;
const userModel = app.model.define('user', {
user_id: {
type: INTEGER(6).UNSIGNED.ZEROFILL,
primaryKey: true,
autoIncrement: true,
allowNull: false,
comment: '用户ID',
},
nick_name: STRING,
user_name: STRING, //账号
password: INTEGER, //密码
}, {
timestamps: true, //自动增加创建表的时间
tableName: 'user', //表名 默认表名是users
paranoid: true, //是否创建删除字段(逻辑删除)
version: true,
});
return userModel;
};
在router.js文件夹里加入在项目启动之前的钩子(创建定义在model里的数据表)
//启动之前创建数据表
app.beforeStart(async () => {
// 应用会等待这个函数执行完成才启动
console.log("==app beforeStart==");
await app.model.sync({
//为true时删除原表创建新表
//为false时不删除原有表,只创建不存在的
force: false,
alter: true
});
});
启动项目后在数据库管理工具中可以看到刚才定义的字段已经创建成功
在app/controller/user.js里添加create()和list()方法
//创建
async create() {
const {
ctx
} = this
//获取post请求过来的数据
const {
nick_name,
user_name,
password
} = ctx.request.body
await ctx.model.User.create({
nick_name,
user_name,
password
})
ctx.body = {
code: 0,
message: "创建成功"
}
}
// 查找所有
async list() {
const {
ctx
} = this;
const token = ctx.request.header.authorization;
//使用插件验证需要加Bearer 自定义中间件验证不需要加
try {
//在查找之前先验证token
ctx.app.jwt.verify(token, ctx.app.jwt.secret);
const user = await ctx.model.User.findAll()
ctx.body = {
code:0,
data:user
}
} catch (error) {
//如果没能验证成功
ctx.body = "token验证失败"
}
}
在router.js里添加对应接口路由
module.exports = app => {
const {
router,
controller,
} = app;
router.post('/user/login', controller.user.login); //用户登录接口
router.post('/user/create', controller.user.create);
router.get('/user/list', controller.user.list);
//启动之前创建数据表
app.beforeStart(async () => {
// 应用会等待这个函数执行完成才启动
console.log("==app beforeStart==");
await app.model.sync({
//为true时删除原表创建新表
//为false时不删除原有表,只创建不存在的
force: false,
alter: true
});
});
};
1.直接去请求list获取用户列表,由于没有token,会被catch捕获并拦截。
2.现在我去请求登录接口拿到token并加到header里面 {authorization:token},再请求用户列表
3.由于加上token过后,jwt通过verify()方法验证token,验证成功后再查询数据,拿到查询到的结果并返回。