$ npm i
$ npm run dev
$ open http://localhost:7001/Context 所有
controller都继承框架内置的Controller;ctx = Context请求对象(用户请求的信息) 如:query:查询条件、ctx.request.body:请求的body的数据、ctx.throw(404,'message')抛出错误
helper
helper用来提供一些实用的公用方法函数,ctx.helper.{xxx}在ctx上就能获取到helper的方法
constController=require('egg').Controller;classUserControllerextendsController{constructor(ctx){super(ctx)}asyncindex(){const{ ctx, service }=this// 获取查询条件constpayload=ctx.query// 调用 Service 进行业务处理,传入条件constres=awaitservice.user.index(payload)// 设置响应内容和响应状态码ctx.helper.success({ ctx, res })}// controller直接调用外部接口asynclogon(){constctx=this.ctx;constresult=awaitctx.curl('http://xxxx/api/login');ctx.status=result.status;ctx.set(result.headers);constdata=result.datactx.body=result.data;}}接受到
controller传入的参数,从数据库中获取数据,组合后return
constService=require('egg').Service;classUserServiceextendsService{asyncindex(payload){const{ search, currentPage, pageSize }=payloadletres=[]res=awaitthis.ctx.model.User.find(search).skip(skip).limit(Number(pageSize)).sort({createdAt: -1}).exec()count=res.lengthlettotal=awaitthis.ctx.model.User.count({}).exec()return{count: count,total:total,list: res,pageSize: Number(pageSize),currentPage: Number(currentPage)}}}RESTful 的方式来定义路由
router.resources()
module.exports=app=>{const{ router, controller }=app;// router.get('/api/user', controller.user.index)// router.post('/api/user', controller.user.create) // router.put('/api/user/:id', controller.user.update)router.delete('/api/user',controller.user.removes)router.resources('user','/api/user',app.jwt,controller.user)};
config/config.default.js配置文件config/plugin.js配置需要加载的插件
[参数文档]https://github.com/node-modules/parameter 查看[taskInterceptor.service.ts][10]
required是否必填type类型allowEmpty允许空字符串,默认为falseformat检查字符串格式 正则匹配max最大长度min最小长度compare检查两处密码是否相等
// config/plugin.jsexports.validate={enable: true,package: 'egg-validate',}// controller/user.jsclassUserControllerextendsController{constructor(ctx){this.UserCreateTransfer={mobile: {type: 'string',required: true,allowEmpty: false,format: /^[0-9]{11}$/},password: {type: 'password',required: true,compare: 'verifyPassWord',allowEmpty: false,min: 6},userName: {type: 'string',required: true,allowEmpty: false}}}asyncupdate(){const{ ctx, service }=thisctx.validate(this.UserUpdateTransfer)const{ id }=ctx.paramsconstpayload=ctx.request.body||{}awaitservice.user.update(id,payload)ctx.helper.success({ ctx })}}// config/plugin.jsexports.cors={enable: true,package: 'egg-cors',}// 跨域// config/config.default.jsconfig.security={csrf: {enable: false,},domainWhiteList: ['http://localhost:4200']//设置白名单}// config/plugin.jsexports.bcrypt={enable: true,package: 'egg-bcrypt'}// config/config.default.jsconfig.bcrypt={saltRounds: 10// default 10}// genHash 加密 awaitthis.ctx.genHash(payload.password)// compare 解密awaitctx.compare(payload.password,user.password)// config/plugin.jsexports.jwt={enable: true,package: 'egg-jwt',}// config/config.default.jsconfig.jwt={secret: 'zChange',enable: true,// default is falsematch: '/jwt',// optional}// service/token.jsconstService=require('egg').Service;classTokenServiceextendsService{asyncgetToken(_id){const{ctx}=this;returnctx.app.jwt.sign({data:{_id:_id},exp: Math.floor(Date.now()/1000)+(60*60*24*7)},ctx.app.config.jwt.secret)}}module.exports=TokenService;// /service/login.jsclassLoginServiceextendsService{asynclogin(payload){const{ ctx, service }=thisconstuser=awaitservice.user.findUser(payload.userName)letverifyPsw=awaitctx.compare(payload.password,user.password)if(!verifyPsw){ctx.throw(404,'user password is error')}return{token: awaitservice.token.getToken(user._id)}}}// app/router.jsrouter.resources('user','/api/user',app.jwt,controller.user)egg自带的错误处理onerror库
all拦截所有错误(定义后其他错误处理将不生效)html自定义html错误处理程序text自定义文本错误处理程序
// config/config.default.jsconfig.onerror={all(err,ctx){ctx.body={code: -1,success:false,message: err.errors ? err.errors : err.message};ctx.status=200;}};mongoose API: http://mongoosejs.com/docs/connections.html
// config/plugin.jsexports.mongoose={enable: true,package: 'egg-mongoose',}// config/config.default.jsconfig.mongoose={url: 'mongodb://127.0.0.1:27017/egg',options: {useMongoClient: true,autoReconnect: true,// 自动连接reconnectTries: Number.MAX_VALUE,// 尝试重试连接:js最大值bufferMaxEntries: 0,},}// model/user.jsmodule.exports=app=>{constmongoose=app.mongooseconstUserSchema=newmongoose.Schema({mobile: {type: String,required: true},password: {type: String,required: true},verifyPassWord: {type: String,required: true},avatar: {type: String,default: 'https://github.com/zChanges/angular-demo/blob/master/src/assets/img/avatar.png?raw=true'},extra: {type: mongoose.Schema.Types.Mixed},userName: {type: String,unique: true,required: true},createdAt: {type: Date,default: Date.now}})returnmongoose.model('User',UserSchema)}}// service/user.jsconstService=require('egg').Service;classUserServiceextendsService{asyncindex(payload){const{ userName, mobile, role, currentPage, pageSize }=payloadletres=[]letcount=0letskip=((Number(currentPage))-1)*Number(pageSize||10)let_filter={$and: [// 多字段同时匹配{userName: {$regex: userName,$options: '$i'}},{mobile: {$regex: mobile}},// $options: '$i' 忽略大小写]}res=awaitthis.ctx.model.User.find(_filter).skip(skip).limit(Number(pageSize)).sort({createdAt: -1}).exec()count=res.lengthlettotal=awaitthis.ctx.model.User.count({}).exec()return{count: count,total:total,list: res,pageSize: Number(pageSize),currentPage: Number(currentPage)}}}