因为egg知识点丰富,分为上下两章点击见上章

导读

egg-从入门到上线 (上)

egg-mongoose专题

10 阿里监控

Node.js 性能平台(alinode)

是面向所有 Node.js 应用提供 性能监控、安全提醒、故障排查、性能优化 等服务的整体性解决方案,提供完善的工具链和服务,协助开发者快速发现和定位线上问题。

npm i nodeinstall -g

提供了egg-alinode 来快速接入,无需安装 agenthub 等额外的常驻服务。

npm i egg-alinode --save
// /config/plugin.jsexports.alinode = {enable:true,package:'egg-alinode',
},

申请一下服务

访问控制台

控制台地址:https://node.console.aliyun.com

// config/config.default.js
exports.alinode = {enable: true,appid: '***',  // Node.js 性能平台给您的项目生成的 appidsecret: '***',  // Node.js 性能平台给您的项目生成的 secretlogdir: '***',  //可选,Node.js 性能平台日志输出地址绝对路径,与 NODE_LOG_DIR 保持一致。如:/tmp/,也可以不写error_log: [// '您的应用在业务层面产生的异常日志的路径,数组,可选,可配置多个',// '例如:/root/.logs/error.#YYYY#-#MM#-#DD#.log',// '不更改 Egg 默认日志输出路径可不配置本项目',],// 可选agentidMode:'IP',  // 可选,如果设置,则在实例ID中添加部分IP信息,用于多个实例 hostname 相同的场景(以容器为主)
};

然后你就能愉快针对你的egg,进行监控了

获取swgger地址 输入浏览器

你看到就是文档了

点击try it out

输入你传的值,然后点击Execute

结果

你就可以获取到接口传递过来的值,效果类似postman,但是清晰程度比postman好

12.5 常见问题

一般情况下都不会有问题,但是如果你这时候巧妙的用了egg-static,那么你就会报错了
经过排查,你就会发现

/node_modules/egg-swagger2/app.js

它会是一个数组,然后报错必须是个字符串,然后你懂得…你给他做成一个字符串即可

11 引入静态文件

11.1 经过测试插件设置

exports.ejs = {enable: true,package: 'egg-view-ejs',
};

11.2 配置设置

a:静态文件

config.static = {prefix: '/',dir: path.join(appInfo.baseDir, 'app/public/')}

当然此时你会遇到一个问题,你想要多个文件该如何事好

 config.static = {prefix: '/',dir: [ path.join(appInfo.baseDir, 'app/view/'),path.join(appInfo.baseDir, 'app/public/uploads/'),path.join(appInfo.baseDir, 'app/public/swagger/') ],};

b:模板设置

config.view = {defaultExt: '.html',mapping: {'.ejs': 'ejs','.html': 'ejs',}
}

11.3 路由控制器设置

//将 index.html 放在app/view里,静态文件放在public里

const { ctx } = this;// render user.htmlyield ctx.render('index');

12 egg-swagger2

12.1 运营场景

作为后台,例如有人需要后台提供文档…人家java都有swagger,egg在 egg-swagger2 支持下,我们也可以使用。

12.2 安装

npm i egg-swagger2 -S

12.3 开启插件

// config/plugin.js
exports.swagger2 = {enable: true,package: 'egg-swagger2',
};

12.4 插件配置

config.default.js 中配置

 config.swagger2 = {enable: true, // 禁用swagger , 默认为truebase: {/* default config,support coverschemes: ['http',],host: '127.0.0.1:7001',basePath: '/',consumes: ['application/json',],produces: ['application/json',],*/info: {description: '文档介绍,version: '1.0.0',title: '文档名称',contact: {email: 'caandoll@aliyun.com',},license: {name: 'Apache 2.0',url: 'http://www.apache.org/licenses/LICENSE-2.0.html',},},tags: [{name: 'admin',description: 'Admin desc',},{name: 'role',description: 'Role desc',},],definitions: {// model definitions},securityDefinitions: {// security definitions}},};

12.4 例子

在 /app/router.js文件中

12.4.1 post请求

module.exports = app => {const { router, controller, swagger } = app;router.post('/login', controller.test.postLogin);swagger.post('/login', {tags: ['admin',],summary: 'Login a admin',description: '',parameters: [{in: 'body',name: 'body',description: 'admin\'s username & password',required: true,schema: {type: 'object',required: [ 'username', 'password' ],properties: {username: {type: 'string',description: 'admin\'s username',},password: {type: 'string',description: 'admin\'s password',},},},},],responses: {200: {description: 'SUCCEED',schema: {type: 'object',properties: {status: {type: 'string',description: 'status',},data: {type: 'object',description: 'data',properties: {token: {type: 'string',description: 'token',},},},},},},},});
}

12.4.2 get请求

module.exports = app => {const { router, controller, swagger } = app;router.get('/roles', controller.test.getRoles);swagger.get('/roles', {tags: ['role',],summary: 'search role by page',description: '',parameters: [{in: 'query',name: 'name',description: 'role\'s name',},{in: 'query',name: 'pageIndex',description: 'pageIndex',},{in: 'query',name: 'pageSize',description: 'pageSize',},],responses: {200: {description: 'SUCCEED',schema: {type: 'object',properties: {status: {type: 'string',description: 'status',},datas: {type: 'array',description: 'result datas',properties: {token: {type: 'string',description: 'token',},},},pageIndex: {type: 'number',description: 'pageIndex',},pageSize: {type: 'number',description: 'pageSize',},totalCount: {type: 'number',description: 'totalCount',},},},},},});
}

12.4.3 swagger的使用

npm run dev 跑起来

获取swgger地址 输入浏览器

你看到就是文档了

点击try it out

输入你传的值,然后点击Execute

结果

你就可以获取到接口传递过来的值,效果类似postman,但是清晰程度比postman好

12.5 常见问题

一般情况下都不会有问题,但是如果你这时候巧妙的用了egg-static,那么你就会报错了
经过排查,你就会发现

/node_modules/egg-swagger2/app.js

它会是一个数组,然后报错必须是个字符串,然后你懂得…你给他做成一个字符串即可

13 表单校验机制

npm egg-validate-plus --save

13.1 开启插件

// config/plugin.{env}.jsexports.validatePlus = {enable: true,package: 'egg-validate-plus',
};

13.2 配置插件

// config/config.{env}.jsconfig.validatePlus = {resolveError(ctx, errors) {if (errors.length) {ctx.type = 'json';ctx.status = 400;ctx.body = {code: 400,error: errors,message: '参数错误',};}}
};

13.3 使用插件

13.3.1 传入字符串

// app/controller/xx.js
const { query } = this.ctx.request;

拿到验证结果

const validateResult = await this.ctx.validate('user.login', query)

验证不通过时,阻止后面的代码执行

if (!validateResult) return

> 注意:不要带上 rules

13.3.2 直接传入验证规则对象

// app/controller/xx.js// 直接引入 rules 文件下的验证规则,也可以是自己写的验证规则对象const rule = this.app.rules.user.login// 数据格式// const rule = {//   id: [//     { required: true },//     { type: 'number', message: 'id 必须为数字 }//   ],//   password: [//     { required: true },//     { type: 'string', message: 'password 必须为字符串 }//   ]// }// 从客户端传入的参数const { query } = this.ctx.request;// 数据格式:
// query = {//   username: 123456,//   password: 'abcdefg'// }// 拿到验证结果const validateResult = await this.ctx.validate(rule, query)// 验证不通过时,阻止后面的代码执行if (!validateResult) return

14 连接redis

Redis client(support redis portocal) based on ioredis for egg framework

14.1 安装

npm i egg-redis --save

14.2 配置

Change ${app_root}/config/plugin.js to enable redis plugin:

exports.redis = {enable: true,package: 'egg-redis',};

Configure redis information in ${app_root}/config/config.default.js:
Single Client

config.redis = {client: {port: 6379,          // Redis porthost: '127.0.0.1',   // Redis hostpassword: 'auth',db: 0,}
}

14.3 使用方法

14.3.1 service

app/service/redis.js
if(this.app.redis)判断是否有启用redis

'use strict';const Service = require('egg').Service;class RedisService extends Service {async set(key, value, seconds) {value = JSON.stringify(value);if (this.app.redis) {if (!seconds) {await this.app.redis.set(key, value);} else {await this.app.redis.set(key, value, 'EX', seconds);}}}async get(key) {if (this.app.redis) {const data = await this.app.redis.get(key);if (!data) return;return JSON.parse(data);}}
}module.exports = RedisService;

14.3.2 controller

app/controller/default/index.js如果没有设置redis缓存,就去请求数据,再设置缓存

var topNav = await this.ctx.service.cache.get('index_topNav');
if (!topNav) {topNav = await this.ctx.model.Nav.find({"position": 1});await this.ctx.service.cache.set('index_topNav', topNav, 60 * 60);
}

15 egg-mongoose专题

mongodb 对于node服务重要性不言而喻所以特别做一个专题来讨论

https://juejin.im/post/5cf497a25188254a842503a3

egg-从入门到上线 (下)相关推荐

  1. 高级转录组调控分析和R语言数据可视化第十三期 (线上线下,7月底开课)

    福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.转录组线上直播课.报名参加线上直播课的老师可在365天内选择参加同课程的一次线下课 .期待和大家的 ...

  2. 【学员分享】深度学习计算机视觉,两个星期从入门到上线

    Hello,everyone!今天给大家讲述一个深度学习项目. 在讲这个项目之前,很多业外人士可能不明白人工智能(AI),机器学习(ML),深度学习(DL),这三者是什么关系.先科普一下小常识,它们三 ...

  3. 【数据竞赛】Kaggle竞赛如何保证线上线下一致性?

    作者: 尘沙樱落.杰少.新峰.谢嘉嘉.DOTA.有夕 验证策略设计 这是一个系列篇,后续我们会按照我们第一章中的框架进行更新,因为大家平时都较忙,不会定期更新,如有兴趣欢迎长期关注我们的公众号,如有任 ...

  4. 推荐算法炼丹笔记:推荐系统采样评估指标及线上线下一致性问题

    本文对于推荐系统中的采样评估指标进行了讨论,内容略多, 还有一些数学推导, 有兴趣的可以去阅读文末给出的原始论文链接, 此处直接列出核心观点: 在评估推荐算法的效果时,能不采样就不采样! 除了AUC, ...

  5. 一门课程学习转录组调控分析和R可视化第十四期 (线上线下开课)

    福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程.转录组线上直播课.报名参加线上直播课的老师可在365天内选择参加同课程的一次线下 ...

  6. 高级转录组调控分析和R语言数据可视化第十三期 (线上线下开课)

    福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程.转录组线上直播课.报名参加线上直播课的老师可在365天内选择参加同课程的一次线下 ...

  7. 高级转录组调控分析和R语言数据可视化第十三期 (线上线下同时开课)

    福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程.转录组线上直播课.报名参加线上直播课的老师可在365天内选择参加同课程的一次线下 ...

  8. 高级转录组调控分析和R语言数据可视化第十四期 (线上线下开课)

    福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程.转录组线上直播课.报名参加线上直播课的老师可在365天内选择参加同课程的一次线下 ...

  9. 重磅回归丨2020云和恩墨大讲堂,线上线下同步开讲!

    我们回来啦! 去年,「云和恩墨大讲堂」启动了定期的线上分享,邀请数据库行业专家进行线上直播,议题涵盖原理解析.应用实践.心得体会--获得了热烈的反响.今年,我们将大讲堂全新升级,增加了线上+线下联动的 ...

最新文章

  1. 腾讯终于良心了!桌面混乱终于有救了
  2. WPF数据绑定(1-简单数据绑定)
  3. MRI炎症和结构损伤指标对TNF拮抗剂治疗AS患者获持续缓解的预测价值
  4. spark如何防止内存溢出_spark开发十大原则
  5. Node.js 使用axios读写influxDB
  6. 计算机网络【五】广播通信+以太网
  7. ORACLE SQL总结六:管理方案对象
  8. 二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面
  9. matlab数据分类与识别,Matlab图像识别/检索系列(3)—10行代码完成caltech图象集分类和识别...
  10. 查看mysql某人执行了什么语句_一条 SQL 语句是如何在 MySQL 中执行的
  11. 微信小程序云开发教程-微信小程序的JS基础-视图层数据更新
  12. fp算法例题_大部分人都理解错了的FPgrowth算法
  13. 2手房地产营销企划书
  14. 数据风云、十年变迁(DTCC会议总结)
  15. log怎么用计算机求,手机计算器log怎么用
  16. 虚拟vpc服务器搭建,服务器搭建vpc
  17. 微信网页授权(OAuth2.0) PHP 源码简单实现
  18. Java ArrayList集合案例(上课笔记)
  19. 蓝牙音箱方案选用及设计注意
  20. android Easypermission权限管理

热门文章

  1. alter table 表名 add constraint 主键名 用法
  2. Python列表推导式
  3. python如何判断类型数据_python如何判断数据类型
  4. 日期获取,获取今天是周几
  5. c 语言pets天梯训练题目,2017年公共英语三级英语知识运用试题
  6. gzip文件格式解析
  7. 迅为IMX8M开发板2gst-inspect-1.0测试
  8. DX9绘图基础-------VB6编程学习DX9游戏编程DirectX9编程2D小游戏源码冷风引擎CoolWind2D游戏引擎(7)
  9. mac下netstat
  10. 手把手教你用Arduino点亮HPDL-1414