一.Egg.JS 简介

Egg.JS是阿里开发的一套node.JS的框架,主要以下几个特点:

  1. Egg 的插件机制有很高的可扩展性,一个插件只做一件事,Egg 通过框架聚合这些插件,并根据自己的业务场景定制配置,这样应用的开发成本就变得很低。
  2. Egg 奉行『约定优于配置』,目录名称规范,团队内部采用这种方式可以减少开发人员的学习成本,
  3. 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模板

模板地址:  https://www.npmjs.com/package/egg-view

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 = [,,];
// 修改加载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=;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 = [,,,];
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+
}
}
//在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 = ;
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>
  1. 添加全局变量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: **,
httpOnly: true, //是否允许在js中获取
signed: true, // 加签防止修改
encrypt: true //如果加密的时候获取时需解密
});

Cookie读取

this.ctx.cookies.get(‘name’)

Cookie保存对象需要加转换

十.Egg中使用session

Session的公共配置

config.session ={

maxAge:**,

renew:true  //每次加载重新计算时间

}

Session设置 

this.ctx.session.userinfo='hahaha'; 

Session读取

this.ctx.session.userinfo

egg.js-基于koa2的node.js入门的更多相关文章

  1. iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备

    安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...

  2. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923887518 处理错误请求 爱能遮掩一切过错. 当我们在访问一个站点的时候,如果访问的地址不存在(404), ...

  3. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 log 日志中间件 最困难的事情就是认识自己. 在一个真实的项目中,开发只是整个投入的一小部分 ...

  4. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 解析JSON

    视频地址:https://www.cctalk.com/v/15114923886141 JSON 数据 我颠倒了整个世界,只为摆正你的倒影. 前面的文章中,我们已经完成了项目中常见的问题,比如 路由 ...

  5. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 处理静态资源

    视频地址:https://www.cctalk.com/v/15114923882788 处理静态资源 无非花开花落,静静. 指定静态资源目录 这里我们使用第三方中间件: koa-static 安装并 ...

  6. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 视图Nunjucks

    视频地址:https://www.cctalk.com/v/15114923888328 视图 Nunjucks 彩虹是上帝和人类立的约,上帝不会再用洪水灭人. 客户端和服务端之间相互通信,传递的数据 ...

  7. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 代码分层

    视频地址:https://www.cctalk.com/v/15114923889408 文章 在前面几节中,我们已经实现了项目中的几个常见操作:启动服务器.路由中间件.Get 和 Post 形式的请 ...

  8. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 规范与部署

    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923889450 规范与部署 懒人推动社会进步. 本篇中,我们会讲述三个知识点 定制书写规范 开发环境运行 如何 ...

  9. egg.js-基于koa2的node.js进阶(一)

    一.路由进阶Egg路由的路由重定向,路由分组 在router.js修改为如下格式require引用 module.exports = app => { const { router, contr ...

随机推荐

  1. 【4】JMicro微服务-服务限流

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 通过配置SMethod的maxSpeed属性实现服务限流,单位是个/每秒(qps),也就是服务方法每秒允许接收的最大请求个数 ...

  2. SQL使用子查询,查找班级成绩最高分

    -- 根据要求,获取班级成绩的最高分的学生-- 第一个子查询,先去各个科目的最高,再横向比较各个科目的最高,再取最高分的那个科目-- 第二个子查询,查询每个同学的最高分-- 最后,通过第一个子查询查询 ...

  3. 剑指offer二十六之二叉搜索树与双向链表

    一.题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二.思路 对二叉搜索树中序遍历的结果即为排序的结果,在中序遍历的过程中,建 ...

  4. ActiveMQ消息持久化到Mysql数据库

    1.把连接MySQL数据库的jar文件,放到ActiveMQ的lib目录下 2.修改ActiveMQ的conf目录下的activemq.xml文件,修改数据持久化的方式2.1 修改原来的kahadb的 ...

  5. Cocos2d-x游戏导出android工程,提取cocos的so文件

      Cocos2d-x游戏导出android工程,提取cocos的so文件   原本cocos游戏的android工程编译时,需要将cocos的库文件进行编译,这些文件大部分是cpp文件, 使用ndk ...

  6. 机器学习-KNN算法

    原理 KNN算法,又叫K近邻算法.就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是 ...

  7. B+树 -- Java实现

    一.B+树定义 B+树定义:关键字个数比孩子结点个数小1的树. 除此之外B+树还有以下的要求: B+树包含2种类型的结点:内部结点(也称索引结点)和叶子结点.根结点本身即可以是内部结点,也可以是叶子结 ...

  8. Python解析xml与JSON

    xml与json是常用的文件交换格式,常用来表示网页的html则是xml的变种.解析xml和json在web开发中有着重要应用. DOM解析XML 文件对象模型(Document Object Mod ...

  9. Socket编程 - API

    基础知识部分:http://www.cnblogs.com/Jimmy1988/p/7839940.html 1. 基本流程 Process Client Server Comment socket( ...

  10. api.closeFrame

    关闭frame closeFrame({params}) params name: 类型:字符串 默认值:无 描述:(可选项)frame 名字,不传时关闭当前 frame 示例代码 api.close ...