egg.js-基于koa2的node.js入门
一.egg.js 简介
egg.js是阿里开发的一套node.js的框架,主要以下几个特点:
- egg 的插件机制有很高的可扩展性,一个插件只做一件事,egg 通过框架聚合这些插件,并根据自己的业务场景定制配置,这样应用的开发成本就变得很低。
- egg 奉行『约定优于配置』,目录名称规范,团队内部采用这种方式可以减少开发人员的学习成本,
- node.遵循mvc框架
mode 层对应server文件夹
view 层 对应view文件
controller 对应 controller文件夹
4.其他
提供基于 egg 定制上层框架的能力,
高度可扩展的插件机制
内置多进程管理
基于 koa 开发,性能优异
框架稳定,测试覆盖率高
渐进式开发
创建项目
cnpm i egg-init -g
egg-init spider --type=simple
cd spider
cnpm i
二.egg快速编辑插件vscode+egg的安装和使用
安装完成egg controller即可一键输出controller基本结构
service,config ,plugin同理,生成controller
'use strict'; const controller = require('egg').controller; class listcontroller extends controller { async echo() { } } module.exports = listcontroller;
egg.js的目录结构如下
三、为好的使用egg安装ejs模板
模板地址:
cnpm install egg-view-ejs --save
ejs配置
修改文件//config/plugin.js
'use strict'; exports.ejs = { enable: true, package: 'egg-view-ejs', };
修改文件//config/config.default
config.view = { mapping: { '.html': 'ejs', }, };
修改//constroller/new.js
async index() { let name = this.ctx.query.name; //query接收动态数据 let id = this.ctx.params.id; //params接收路由传值 let list = [1,2,3]; // 修改加载ejs的方式 await this.ctx.render('news',{name,id,list}) } module.exports = newscontroller;
四.动态参数的读取get,query传值和params传值
4.1 constroller里写
let name = this.ctx.query.name; //query接收动态数据 let id = this.ctx.params.id; //params接收路由传值
4.2 router文件动态配置id参数
router.get('/news', controller.news.index); router.get('/news/:id', controller.news.index);
4.3 模板文件解析参数的写法view/news.html
<!doctype html><html lang="en"><head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <link rel="stylesheet" href="/public/css/basic.css"> <title>document</title></head><body> <p>query:<%= name %></p> <p>params<%= id %></p> <ul> <% for(var i=0;i<list.length;i++){ %> <li><%= list[i]%></li> <% } %> </ul> <img src="/public/img/timg.jpg"/> </body> </html>
五.server文件的封装
server的封装是为了数据在多个constroller中都可以用到,以达到一次渲染多处调用的目的
在service下面新建 new.js 并在里面建 list服务
'use strict'; const service = require('egg').service; class newsservice extends service { async list() { let list = [1,2,3,4]; return list } } module.exports = newsservice;
server在controller中的引用
let list = await this.service.news.list(); //service的引用
六.egg插件机制的使用
新建extend文件夹 extend提供的扩展功能
application
context
helper //工具方法
request
在extend目录下新建helper.js
application.js 挂载app的方法
/* 外部可以通过 this.app.foo() */ module.exports = { foo(param) { // this 就是 app 对象,在其中可以调用 app 上的其他方法,属性 // console.log(this); return this.config.api; }, };
context.js
/* 外部可以通过 this.ctx.gethost() */ module.exports={ gethost(){ // this 就是 ctx 对象,在其中可以调用 ctx 上的其他方法,或访问属性 return this.request.host; } }
helper.js 工具函数类
module.exports = { formatdate(time) { return time+100 } } //在view下的html文件中的调用方式 <%= helper.formatdate(list[i].dateline)%>
request.js 请求
/*外部可以通过 this.ctx.request.foo()*/ module.exports = { foo(param) { // console.log(this); return this.header.host; }, };
七.egg中间件middleware
中间件:匹配路由前、匹配路由完成做的一系列的操作。 egg 是基于 koa 实现的,所以 egg 的中间件形式和 koa 的中间件形式是一样的,都是基于洋葱圈模型
egg中间件放置在 app/middleware 目录下的单独文件,它需要 exports 一个普通的 function,接受两个参数:
options: 中间件的配置项,框架会将 app.config[${middlewarename}] 传递进来。
app: 当前应用 application 的实例。
1、app/middleware下面新建forbidip.js 内容如下:
module.exports = (options, app) => { return async function forbidipmiddleware(ctx, next) { console.log(options); //传过来的参数 console.log(ctx.request.ip); //获取当前的ip var sourceip=ctx.request.ip; const match = options.ip.some(val =>{ if(val==sourceip){ return true; } }); if (match) { ctx.status = 403; ctx.message = 'go away, robot.'; } else { await next(); } } };
2、找到config.default.js配置当前项目需要使用的中间件以及中间件的参数
//中间件 config.middleware = ['forbidip']; config.forbidip = { ip: [ '127.0.0.1', '192.168.0.1' ], };
八.egg中间件post提交数据安全,csrf的防范机制
所有post请求需要引入 csrf
async forms() { await this.ctx.render('forms'{csrf:this.ctx.csrf}) }
<form action="/add?_csrf=<%=csrf%>" method="post"> <!-- <input type="text" type="hidden" name="csrf" value="<%=csrf%>"> --> 用户名: <input type="text" name="username"><br/> 密码: <input type="text" name="password" type="password"><br/> <input type="submit" value="提交"> </form>
- 添加全局变量csrf,设置为中间件
在middleware下增加 auth.js
module.exports = (option,app) => { return async function auth(ctx,next){ //添加全局变量 ctx.state.csrf = ctx.csrf; await next(); } }
在 config/config.default.js下调用中间件
config.middleware = ['auth'];
九.egg中使用cookies
cookie设置
this.ctx.cookies.set('username','张三',{ maxage: 1000*3600*24, httponly: true, //是否允许在js中获取 signed: true, // 加签防止修改 encrypt: true //如果加密的时候获取时需解密 });
cookie读取
this.ctx.cookies.get(‘name’)
cookie保存对象需要加转换
十.egg中使用session
session的公共配置
config.session ={ maxage:30*1000*60, renew:true //每次加载重新计算时间 }
session设置
this.ctx.session.userinfo='hahaha';
session读取
this.ctx.session.userinfo
上一篇: PyQt5多线程防卡死和多窗口用法的实现
下一篇: 解决vs2017不能添加引用问题
推荐阅读
-
详解基于node.js的脚手架工具开发经历
-
详解基于Node.js的微信JS-SDK后端接口实现代码
-
JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
-
JAVA WEB快速入门之从编写一个基于SpringMVC框架的网站了解Maven、SpringMVC、SpringJDBC
-
推荐一个基于Node.js的表单验证库
-
基于vue-cli构建vue-router的入门级demo
-
基于node.js实现爬虫的讲解
-
01Spring基于xml的IOC配置--入门
-
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
-
基于Oracle的面向对象技术入门基础简析开发者网络Oracle