egg.js使用sequelize+mysql创建数据表并带token验证信息请求数据

上一篇:jwt登录鉴权获取token配置和示例地址

如果你没有安装Mysql数据库,先去安装再来学习

一.连接数据库

1. 安装 egg-sequelize 插件和 mysql2 模块

npm install --save egg-sequelize mysql2

2. 配置egg-sequelize插件

同样在config/plugin.js文件中配置

module.exports = {
  sequelize: {
    enable: true,
    package: 'egg-sequelize',  
  },
  //权限验证插件
  jwt: {
    enable: true,
    package: 'egg-jwt',
  }
};

3. 连接Mysql数据库

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语句,也方便数据的结构的管理

1. 创建数据表

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
    });
  });

启动项目后在数据库管理工具中可以看到刚才定义的字段已经创建成功
在这里插入图片描述

2. 添加数据并请求数据

在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
    });
  });

};

使用postman测试刚刚写的接口:首先去添加一个用户信息
在这里插入图片描述

不带token的请求结果

1.直接去请求list获取用户列表,由于没有token,会被catch捕获并拦截。
在这里插入图片描述

带token后的请求结果

2.现在我去请求登录接口拿到token并加到header里面 {authorization:token},再请求用户列表
在这里插入图片描述
3.由于加上token过后,jwt通过verify()方法验证token,验证成功后再查询数据,拿到查询到的结果并返回。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值