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

带token验证信息请求数据

  • 一.连接数据库
    • 1. 安装 egg-sequelize 插件和 mysql2 模块
    • 2. 配置egg-sequelize插件
    • 3. 连接Mysql数据库
  • 二.创建数据表
    • 1. 创建数据表
    • 2. 添加数据并请求数据
      • 不带token的请求结果
      • 带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测试刚刚写的接口:首先去添加一个用户信息
egg.js使用sequelize+mysql创建数据表并带token验证信息请求数据_第1张图片

不带token的请求结果

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

带token后的请求结果

2.现在我去请求登录接口拿到token并加到header里面 {authorization:token},再请求用户列表
egg.js使用sequelize+mysql创建数据表并带token验证信息请求数据_第2张图片
3.由于加上token过后,jwt通过verify()方法验证token,验证成功后再查询数据,拿到查询到的结果并返回。

你可能感兴趣的:(Node.js学习到实战,node.js,mysql,安全,orm)