欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

egg.js-基于koa2的node.js入门

程序员文章站 2022-03-08 22:31:46
一.Egg.JS 简介 Egg.JS是阿里开发的一套node.JS的框架,主要以下几个特点: Mode 层对应server文件夹 View 层 对应view文件 Controller 对应 Controller文件夹4.其他 提供基于 Egg 定制上层框架的能力, 高度可扩展的插件机制 内置多进程管 ......

一.egg.js 简介

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

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

        mode 层对应server文件夹

       view 层 对应view文件

      controller 对应 controller文件夹
4.其他

提供基于 egg 定制上层框架的能力,

高度可扩展的插件机制

内置多进程管理

基于 koa 开发,性能优异

框架稳定,测试覆盖率高

渐进式开发

egg.js-基于koa2的node.js入门

创建项目

 cnpm i  egg-init -g

 egg-init spider --type=simple

 cd spider

 cnpm i

 

二.egg快速编辑插件vscode+egg的安装和使用

egg.js-基于koa2的node.js入门

egg.js-基于koa2的node.js入门

安装完成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.js-基于koa2的node.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>

  egg.js-基于koa2的node.js入门

五.server文件的封装

server的封装是为了数据在多个constroller中都可以用到,以达到一次渲染多处调用的目的

egg.js-基于koa2的node.js入门

在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>
  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: 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