egg
安装
$ mkdir 创建目录 && cd 创建目录
$ npm init egg --type=simple
$ npm i
网址
// 使用post 会报 csrf token 问题 // 安装 : npm i egg-cors - save // 配置插件 // config/plugin.js // 跨域的插件 cors: { enable: true, package: 'egg-cors' }
// config/config.default.js // 关闭csrf 开启跨域 config.security = { // 关闭csrf csrf: { enable: false }, //跨域白名单 domainWhiteList: ['http://127.0.0.1:8080'] }; // 允许跨域的方法 config.cors = { origin: '*', allowMethods: 'GET,PUT,POST,DELETE,PATCH' };
ctx
获取url问号get传值参数 : this.ctx.query
获取:id 传递过来的参数 : this.ctx.params
获取post请求传递的参数 : this.ctx.request.body
修改状态码 : this.ctx.status
创建数据库和数据表
操作数据库和表 ==> 叫做模型
// app/model/user.js 'use strict'; module.exports = (app) => { const { INTEGER, STRING, DATE, ENUM } = app.Sequelize; // 配置(重要:一定要配置详细,一定要!!!) const User = app.model.define('user', { id: { type: INTEGER(20).UNSIGNED, primaryKey: true, //主键 autoIncrement: true //自增 }, username: { type: STRING(30), allowNull: false, //不允许为空 defaultValue: '', //默认值为空 comment: '用户名称', //备注用户名 unique: true //唯一性 }, password: { type: STRING(200), allowNull: false, defaultValue: '', }, avatar_url: { type: STRING(200), allowNull: false, defaultValue: '', }, sex: { type: ENUM, values: ['男', '女', '保密'], allowNull: false, defaultValue: '男', comment: '用户性别', }, created_at: DATE, updated_at: DATE, }); return User; };
这个 Model 就可以在 Controller 和 Service 中通过 app.model.User
或者 ctx.model.User
访问到了
增 : 添加数据到数据库
create : 单条
bulkCreate : 批量
// 创建用户 async createUser() { // 如何拿到模型 : this.ctx.model.User create({})添加入数据库 // 1.前端传递的,后端写入数据库 // await this.ctx.model.User.create({ // username:this.ctx.request.body.username, // password:this.ctx.request.body.password, // avatar_url:this.ctx.request.body.avatar_url || '111', // sex:this.ctx.request.body.sex // }) // 2.自己新增 await this.ctx.model.User.create({ username:'吴宇腾5', password:'123456', sex:'女' }) // 3.批量新增 // await this.ctx.model.User.bulkCreate([ // { // username:'吴宇腾1', // password:'123456', // sex:'女' // }, // { // username:'吴宇腾2', // password:'123456', // sex:'女' // }, // { // username:'吴宇腾3', // password:'123456', // sex:'女' // }, // ]) // 可以获取body返回的东西 console.log(this.ctx.request.body); // 参数验证 , 写入数据库 this.ctx.body = { message:'success', }
查 : 查询数据库的信息
findByPK : 通过主键查询单个数据
// 1.findByPK : 通过主键查询单个数据 // let datas = await this.ctx.model.User.findByPk(id) // this.ctx.body = { // message:'success', // data:datas // }
查询单个 -- 多个条件 findOne({where:{}})
// 2.查询单个 -- 多个条件 findOne({where:{}}) // let datail = await this.ctx.model.User.findOne({ // where:{ // id:id, // sex:'男' // } // }) // this.ctx.body = { // message:'success', // data:datail // }
查询多个并计数 findAndCountAll
let data = await this.ctx.model.User.findAndCountAll()
查询多个 findAll
async index() { // 获取url问号get传值参数 console.log(this.ctx.query); // 分页的功能 let page = this.ctx.query.page let limit = 5 let offset = (page-1) * 5 // 查询多个 findAll let Op = this.app.Sequelize.Op let data = await this.ctx.model.User.findAll({ where:{ sex:"女", // 模糊查询 username:{ [Op.like]:"%吴宇腾%" } }, // 返回的字段 // attributes:['id','username','sex'] attributes:{ // 排除掉某字段,其他全部返出 exclude:['password'] }, // 排序 DESC降序 ASC升序 order:[ ['updated_at','DESC'], ['id','DESC'] ], // 偏移 offset, // 赛选多少条 limit }) console.log(data); this.ctx.body = { message: 'success', data: data } // 修改状态码 this.ctx.status=200 }
改 unpdate
// 修改用户 改 async updataUser(){ const id = this.ctx.params.id ? parseInt(this.ctx.params.id) : 0 console.log(id); let data = await this.ctx.model.User.findByPk(id) if(!data){ this.ctx.body = { msg:'error', data:'该记录不存在' } return; } // // 第一种方法 // data.username = '被修改了' // // 保存一下数据库data.save fields 只能修改的字段 // let res = await data.save({fields:['username']}) // 第二种方法 update 不需要data.save() fields 只能修改的字段 let params = this.ctx.request.body let res = await data.update(params,{fields:['username']}) this.ctx.body = { msg:'message', data:res } }
删 destroy
async destroy(){ // 软删除 : 删除一条 (数据库还是存在的) // let id = this.ctx.params.id // let data = await this.ctx.model.User.findByPk(id) // if(!data){ // this.ctx.body = { // msg:'error', // data:'该记录不存在' // } // return // } // let res = await data.destroy() // this.ctx.body = { // msg:'message', // data:res // } // 软删除 : 批量删除 let Op = this.app.Sequelize.Op let res = await this.ctx.model.User.destroy({ where:{ id:{ [Op.lte]:4 } } }) this.ctx.body = { msg:'message', data:res } }
错误日志的中间插件
app/middleware/errora.js
module.exports = ()=>{ return async function errora(ctx,next){ try { await next() } catch (err) { // 所有的异常都在app上触发一个error事件,框架会记录一条错误日志 ctx.app.emit('error',err,ctx) const status = err.status || 500; // 生成环境500错误不返回给客户端,因为可能包含敏感信息 const error = status === 500 && ctx.app.config.env === 'prod' ? 'Internal Server Error' : err.message; // 从error对象上读取出个个属性,设置到响应中 ctx.body = {error} if(status === 422){ ctx.body.detail = err.errors } ctx.status = status // ctx.body = { // msg:'fail', // data:error.message // } } } }
config/config/default.js
// 配置中间件的 config.middleware = ['errora'];
使用 :
// 抛出异常 this.ctx.throw(500,'故意出错')
中间件配置
// 配置中间件参数 config.errora = { ceshi: 123, // 通用配置(以下是重点) enable:true, // 控制中间件是否开启。 //多个配置成数组 // match:'/user/destroy/:id', // 设置只有符合某些规则的请求才会经过这个中间件(匹配路由) ignore:'/user/destroy/:id' // 设置符合某些规则的请求不经过这个中间件。 /** 注意: 1. match 和 ignore 不允许同时配置 2. 例如:match:'/news',只要包含/news的任何页面都生效 **/ // match 和 ignore 支持多种类型的配置方式:字符串、正则、函数(推荐) // match(ctx) { // // 只有 ios 设备才开启 // const reg = /iphone|ipad|ipod/i; // return reg.test(ctx.get('user-agent')); // }, };
修改器 : 增加和修改数据的时候会触发
password: { type: STRING(200), allowNull: false, defaultValue: '', // 修改器 set(val){ let hash = val + '1123456' this.setDataValue('password',hash) } },
获取器
created_at: { type:DATE, // 获取器 - 查询的时候会调用 // this.getDataValue('created_at') 获取原始数据 get(){ const val = this.getDataValue('created_at') return (new Date(val)).getTime() } },
本文来自博客园,作者:杨建鑫,转载请注明原文链接:https://www.cnblogs.com/qd-lbxx/p/16806406.html