egg基础

安装egg脚手架以及使用egg-init创建项目

nodejs建议安装LTS版本,(稳定版本)

方式一、
1.全局安装egg.js的脚手架工具egg-init:
npm i egg-init -g
2.cd 到项目目录
egg-init --type=simple
3.执行npm install 安装依赖
4.执行npm run dev 启动项目
方式二、
1.建立一个空的文件夹,在当前文件目录下执行
npm init egg --type=simple
2.然后会出现一些选项,填写项目名称之类的,可以直接一路回车选择默认配置
3.cd 到项目目录
4.执行npm install 安装依赖
5.执行npm run dev 启动项目

项目目录约定

app/public 放静态资源
app/service 用于编写业务逻辑层, 查询数据库,请求数据,数据处理
app/middleware 中间件
app/router.js 用于配置 URL 路由规则
app/extend/** 用于框架的扩展,

MVC

view控制 视图 模板 页面的显示
controller 控制器, 负责处理业务逻辑
model(service文件夹内) 模型: 负责和数据打交道(查询数据库,请求数据)

vscdoe插件

编辑器商店搜索安装eggjs 智能语法提示

egg基于koa,egg将ctx对象封装到了this上。

// 在koa中,通过ctx.body = ‘hello, egg’;形式给用户响应信息,
// egg中通过this.ctx.body = ‘hello, egg’;形式给用户响应信息,

// koa中获取get传值:ctx.query
// egg中获取get传值:this.ctx.query

// koa中获取get传值:ctx.params
// egg中获取get传值:this.ctx.params

// egg渲染模板引擎:this.ctx.render(‘模板文件名’)

路由跳转

this.ctx.redirect(’/path’)

模板引擎egg-view-ejs

安装:npm install --save egg-view-ejs
配置:在config/plugin.js中复制下面代码

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

配置:在config/config.default.js复制下面代码

// exports.view = {
//     mapping:{
//         '.html':'ejs'
//     }
// }

模板文件内引入静态资源(/路径)

<img src="/public/images/index.jpg" alt="">

// 调用server文件下的服务的方法(service已被框架绑定到了this上)
// this.service.文件名.文件内的方法

服务继承于 Service,为了方便egg在this上绑定了以下的方法:

this.ctx: 当前请求的上下文 Context 对象的实例,通过它我们可以拿到框架封装好的处理当前请求的各种便捷属性和方法。
this.app: 当前应用 Application 对象的实例,通过它我们可以拿到框架提供的全局对象和方法。
this.service:应用定义的 Service,通过它我们可以访问到其他业务层,等价于 this.ctx.service 。
this.config:应用运行时的配置项。
this.logger:logger 对象,上面有四个方法(debug,info,warn,error),分别代表打印四个不同级别的日志,
使用方法和效果与 context logger 中介绍的一样,但是通过这个 logger 对象记录的日志,在日志前面会加上打印该日志的文件路径,以便快速定位日志打印位置。
,分别代表打印四个不同级别的日志,使用方法和效果与 context logger 中介绍的一样,
但是通过这个 logger 对象记录的日志,在日志前面会加上打印该日志的文件路径,以便快速定位日志打印位置。

服务的命名规则

Service 文件必须放在 app/service 目录,可以支持多级目录,访问的时候可以通过目录名级联访问。
app/service/biz/user.js => ctx.service.biz.user(建议这种写法)
app/service/sync_user.js => ctx.service.syncUser (如果文件名带有下划线,访问时要讲下划线命名改为驼峰命名)
app/service/HackerNews.js => ctx.service.hackerNews (如果文件名首字母大写,访问时首字母要为小写)
JSON.parse()方法可以将buffer类型数据转为json

框架扩展

Application:
//app 对象指的是 Koa 的全局应用对象,全局只有一个,在应用启动时被创建。
//Controller,Middleware,Helper,Service 中都可以通过 this.app 访问到 Application 对象
Context:Context 指的是 Koa 的请求上下文,这是 请求级别 的对象,每次请求生成一个 Context 实例,通常我们也简写成 ctx
Request:request 对象和 Koa 的 Request 对象相同,是 请求级别 的对象,它提供了大量请求相关的属性和方法供使用
Response:Response 对象和 Koa 的 Response 对象相同,是 请求级别 的对象,它提供了大量响应相关的属性和方法供使用
Helper

扩展方式

框架会把 app/extend/application.js 中定义的对象与 Koa Application 的 prototype 对象进行合并,在应用启动时会基于扩展后的 prototype 生成 app 对象
例:
这样写后,就可以在外部,用this.app.foo()调用到这个方法,获取里面的status

// app/extend/application.js
module.exports = {
  foo(param) {
    // this 就是 app 对象,在其中可以调用 app 上的其他方法,或访问属性
    let status = 'success'
    return status
  },
};

中间件

匹配路由之前,匹配路由完成,所做的一系列操作

配置:

我们约定一个中间件是一个放置在 app/middleware 目录下的单独文件,它需要 exports 一个普通的 function,接受两个参数:

options: 中间件的配置项,框架会将 app.config[${middlewareName}] 传递进来。
app: 当前应用 Application 的实例。
使用中间件:
1.在应用中使用中间件
在 config.default.js 中加入下面的配置就完成了中间件的开启和配置:

module.exports = {
  // 配置中间件,数组里是中间件的文件名
  config.middleware = ['printdata','forbidip'];

  // 给printdata中间件传入参数(这个参数在printdata文件内的第一个参数options内接受到)
  config.printdata = {
    name:'lval'
  }
};

获取get传值

egg中获取get传值:this.ctx.query

获取post传值

egg中获取post传值:this.ctx.request.body 即可获取,不需要配置任何中间件

安全机制:
CSRF 攻击:伪造用户请求向网站发起恶意请求。
这个机制的使所有post请求都不会通过,需要我们利用this.ctx.csrf给用户生成一个密钥,并在模板引擎中接收这个密钥
设置一个中间件,代码如下(注意在config.default.js中配置中间件)


module.exports = (options,app)=>{

    // options: 中间件的配置项,框架会将 app.config[${middlewareName}] 传递进来。
    // app: 当前应用 Application 的实例。

    // 返回一个异步方法

    return async function auth(ctx,next){
        
        
        // 设置模板全局变量
        ctx.state.csrf = ctx.csrf
        
        await next()
        
    }

}

模板部分:



<!--模板 -->
<form action="/add?_csrf==<%= csrf %>" method="POST">
        name:<input type="text" name='username'>
        <br/>
        pswd:<input type="password" name="password">
        <br/>
        <button type="submit">提交</button>

    </form>


cookie的设置与获取

cookie默认页面关闭销毁

设置:this.ctx.cookies.set(key,value,options)

this.ctx.cookies.set('name','lval')

获取:this.ctx.cookies.get(key,options)

this.ctx.cookies.get('name')

options的参数:
{Number} maxAge: 设置这个键值对在浏览器的最长保存时间。是一个从服务器当前时刻开始的毫秒数。

{Date} expires: 设置这个键值对的失效时间,如果设置了 maxAge,expires 将会被覆盖。如果 maxAge 和 expires 都没设置,Cookie 将会在浏览器的会话失效(一般是关闭浏览器时)的时候失效。

{String} path: 设置键值对生效的 URL 路径,默认设置在根路径上(/),也就是当前域名下的所有 URL 都可以访问这个 Cookie。

{String} domain: 设置键值对生效的域名,默认没有配置,可以配置成只在指定域名才能访问。

{Boolean} httpOnly: 设置键值对是否可以被 js 访问,默认为 true,不允许被 js 访问。

{Boolean} secure: 设置键值对只在 HTTPS 连接上传输,框架会帮我们判断当前是否在 HTTPS 连接上自动设置 secure 的值。

egg框架另外拓展了三个参数:
{Boolean} overwrite:设置 key 相同的键值对如何处理,如果设置为 true,则后设置的值会覆盖前面设置的,否则将会发送两个 set-cookie 响应头。

{Boolean} signed:设置是否对 Cookie 进行签名,如果设置为 true,则设置键值对的时候会同时对这个键值对的值进行签名,后面取的时候做校验,可以防止前端对这个值进行篡改。默认为 true。

{Boolean} encrypt:设置是否对 Cookie 进行加密,如果设置为 true,则在发送 Cookie 前会对这个键值对的值进行加密,客户端无法读取到 Cookie 的明文值。默认为 false。
如果对cookie进行了加密,获取时也要对应进行解密
如:

//设置时进行了加密
this.ctx.cookies.set('name','lval',{encrypt:true})

//获取时进行解密
this.ctx.cookies.get('name',{encrypt:true})
cookie设置中文

方案一、
egg里的cookie默认无法设置中文
但如果cookie设置时进行了加密(encrypt设置为true),那就可以设置中文cookie
方案二、
利用buffer

    //设置时,先将数据转为base64字符串
    var data = new Buffer('hello word').toString('base64')
    //获取时,还原base64字符串
    console.log(new Buffer(data,'base64').toString())
cookie设置对象

设置时,
先用JSON.stringify() 反序列一下
获取时,
在用JSON.parse() 将字符串转为对象

清除cookie

方式一:设置cookie为空
this.ctx.cookies.set(‘key’,null)

方式二:设置过期时间maxAge为0
this.ctx.cookies.set(‘key’,null,{maxAge:0})

session 设置与获取

设置:this.ctx.session.key = value
//比如设置一个user
this.ctx.session.user = {name:'lval'}

获取:this.ctx.session.key
//获取user
this.ctx.session.user

session的默认设置(配置和cookie类似)

  exports.session={
    key:'EGG_SESS', //设置session默认的key
    maxAge:24*3600*1000, //一天
    httpOnly:true,
    encrypt:true, //是否加密
    renew:true, //为true时每次刷新页面session都会被延期,(maxAge到期后会自动再次设置)
  }

设置参数

方式一、直接修改参数(不建议)

//设置过期时间为10分钟
this.ctx.session.maxAge = 60*1000*10

方式二、在config/config.default.jsn内进行配置

config.session = {
    maxAge: 60*1000*6, //设置过期时间为六分钟
  }

猜你喜欢

转载自blog.csdn.net/weixin_42215897/article/details/103696089
egg