egg-从入门到上线 (下)
因为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-从入门到上线 (下)相关推荐
- 高级转录组调控分析和R语言数据可视化第十三期 (线上线下,7月底开课)
福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.转录组线上直播课.报名参加线上直播课的老师可在365天内选择参加同课程的一次线下课 .期待和大家的 ...
- 【学员分享】深度学习计算机视觉,两个星期从入门到上线
Hello,everyone!今天给大家讲述一个深度学习项目. 在讲这个项目之前,很多业外人士可能不明白人工智能(AI),机器学习(ML),深度学习(DL),这三者是什么关系.先科普一下小常识,它们三 ...
- 【数据竞赛】Kaggle竞赛如何保证线上线下一致性?
作者: 尘沙樱落.杰少.新峰.谢嘉嘉.DOTA.有夕 验证策略设计 这是一个系列篇,后续我们会按照我们第一章中的框架进行更新,因为大家平时都较忙,不会定期更新,如有兴趣欢迎长期关注我们的公众号,如有任 ...
- 推荐算法炼丹笔记:推荐系统采样评估指标及线上线下一致性问题
本文对于推荐系统中的采样评估指标进行了讨论,内容略多, 还有一些数学推导, 有兴趣的可以去阅读文末给出的原始论文链接, 此处直接列出核心观点: 在评估推荐算法的效果时,能不采样就不采样! 除了AUC, ...
- 一门课程学习转录组调控分析和R可视化第十四期 (线上线下开课)
福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程.转录组线上直播课.报名参加线上直播课的老师可在365天内选择参加同课程的一次线下 ...
- 高级转录组调控分析和R语言数据可视化第十三期 (线上线下开课)
福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程.转录组线上直播课.报名参加线上直播课的老师可在365天内选择参加同课程的一次线下 ...
- 高级转录组调控分析和R语言数据可视化第十三期 (线上线下同时开课)
福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程.转录组线上直播课.报名参加线上直播课的老师可在365天内选择参加同课程的一次线下 ...
- 高级转录组调控分析和R语言数据可视化第十四期 (线上线下开课)
福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程.转录组线上直播课.报名参加线上直播课的老师可在365天内选择参加同课程的一次线下 ...
- 重磅回归丨2020云和恩墨大讲堂,线上线下同步开讲!
我们回来啦! 去年,「云和恩墨大讲堂」启动了定期的线上分享,邀请数据库行业专家进行线上直播,议题涵盖原理解析.应用实践.心得体会--获得了热烈的反响.今年,我们将大讲堂全新升级,增加了线上+线下联动的 ...
最新文章
- 腾讯终于良心了!桌面混乱终于有救了
- WPF数据绑定(1-简单数据绑定)
- MRI炎症和结构损伤指标对TNF拮抗剂治疗AS患者获持续缓解的预测价值
- spark如何防止内存溢出_spark开发十大原则
- Node.js 使用axios读写influxDB
- 计算机网络【五】广播通信+以太网
- ORACLE SQL总结六:管理方案对象
- 二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面
- matlab数据分类与识别,Matlab图像识别/检索系列(3)—10行代码完成caltech图象集分类和识别...
- 查看mysql某人执行了什么语句_一条 SQL 语句是如何在 MySQL 中执行的
- 微信小程序云开发教程-微信小程序的JS基础-视图层数据更新
- fp算法例题_大部分人都理解错了的FPgrowth算法
- 2手房地产营销企划书
- 数据风云、十年变迁(DTCC会议总结)
- log怎么用计算机求,手机计算器log怎么用
- 虚拟vpc服务器搭建,服务器搭建vpc
- 微信网页授权(OAuth2.0) PHP 源码简单实现
- Java ArrayList集合案例(上课笔记)
- 蓝牙音箱方案选用及设计注意
- android Easypermission权限管理