当前位置: 主页 > 日常积累 > node >

egg学习心得(基础篇)

摘要:用koa写完一个cms后,发现代码的管理型用一些欠缺,没有规范的划分中间件,业务层和路由的管理,为了让代码更有规范性和管理,便开始学习了egg.js,也是初步开始写,一个脚印算一步吧~~,但愿学以致用,具体的请看官方文档内容

1、eggjs的基本结构划分

egg-project
├── package.json
├── app (项目开发目录) 
|    ├── router.js (路由层)
│   ├── controller (业务层)
│   |   └── home.js
│   ├── service (model层)
│   |   └── user.js
│   ├── middleware (中间件)
│   |   └── response_time.js
│   ├── schedule (可选)
│   |   └── my_task.js
│   ├── public (静态层)
│   |   └── reset.css
│   ├── view (模板层)
│   |   └── home.tpl
│   └── extend (扩展层)
│       ├── helper.js (可选)
│       ├── request.js (可选)
│       ├── response.js (可选)
│       ├── context.js (可选)
│       ├── application.js (可选)
│       └── agent.js (可选)
├── config(配置)
|   ├── plugin.js
|   ├── config.default.js

2、egg-view-ejs 的使用

npm i egg-view-ejs

 找到config进行配置到config,让他随着config暴露出来,直接在view层新建对应的文件,然后通过路由去传入

//==config/config.default.js,
/*配置 ejs 模板引擎 */
config.view={ mapping:{ '.html':'ejs', } }; //暴露给view层,直接在view层使用
//==/config/plugin.js
'use strict';
exports.ejs = {
enable: true,
package: 'egg-view-ejs',
};

3.路由层和view层和业务层的联动

路由配置

//==app/router.js
module.exports = app => {
  const { router, controller } = app;
  router.get('/user/index', controller.user.info); //get,表示请求方法,第一个值表示,访问外部连接,第二个值表示业务层的文件目录,接受的方法
};

逻辑层(model) 将复杂的业务写在里面,然后在暴露出去

//==app.service.news
'use strict';
const Service = require('egg').Service;
class NewsService extends Service {
async getNewsList() {
const list = ["nid","jdhsjd","jsdjkd"];
}
return data.result
}}
module.exports = NewsService;

业务层配置

//==app/controller/userjs
const list = await this.service.news.getNewsList(); //逻辑太多,放入model层
//使用ctx的render的方法,调用view下面的页面结构,和将后台的参数传入给前台页面
await this.ctx.render("news", { 
list
})
}

模板层(view)配置

<!--add/view/news.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="/public/css/basic.css"> <!--静态资源配置-->
</head>
<body>
<ul>
<%  for(var i=0;i<list.length;i++){%>
<li><%=list[i]%></li>
<%}%>
</ul>
</body>

post请求以及安全机制问题

egg设置了安全机制,必须要接受一个_csrf参数,才能通过请求,不然会报错

安全机制配置写入中间件:

/*
*app/middleware/confogCsrf.js
*ctx.state.csrf=ctx.csrf; 设置全局变量,写入中间件层
*实例:
*/
module.exports = (options)=>{
return  async function configCsrfs(ctx,next){
csrf = ctx.csrf;
await next()
}
}

rouote配置

router.get("/add", controller.news.getNewsAdds)
router.post("/add", controller.news.getNewsAdds) //这里就不展开了

controller配置

//==controller/news/getNewsAdds
async getNewsAdds(){
await this.ctx.render("get_add")
}

view调用

<!--app/view/get_add-->
<form action="/add?_csrf=<%=csrf%>" method="POST">
账号: <input type="text" name="user"> <br>
密码: <input type="password" name="password"> <br>
<input type="submit" value="提交">
</form>

cookie和session的配置

cookie调用

//cookie设置值
this.ctx.cookies.set('name','xiaochao')
//cookie获取值
this.cookie.ctx.cookies.get('name')
//清除cookie或过期时间为0
this.ctx.cookies.set('name',null)

config配置cookie

maxAge:24 * 3600 * 1000,  //过期时间清除数据
httpOnly: true, //只能通过node访问
encrypt: true //加密

session配置

seeion的调用(在A页面设置,在B页面里获取调用的值)

//添加seetion 
 this.ctx.session.visited  = "xiaochao.me"
//修改session
 this.ctx.session.visited = ctx.session.visited ? (ctx.session.visited + 1) : 1;  
//获取session
const userId = ctx.session.userId;
//清除session 
ctx.session = null;

config的配置

config.session = {
  key: 'EGG_SESS', // key 代表了存储 Session 的 Cookie 键值
  maxAge: 24 * 3600 * 1000, // 1 天
  httpOnly: true, //只能通过node访问
  encrypt: true, //加密
  renew: true, //延长用户有效期
};


[日志信息]

该日志于 2018-09-18 15:46 由 陈文超 发表在 未知 网站下,你除了可以发表评论外,还可以转载 “egg学习心得(基础篇)” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)

Copyright © 2015-2018 陈文超博客 保留所有权利 琼ICP备15003229号| 托管于阿里云 · 博客稳定运行 | 网站地图 |

返回顶部