脚手架安装
1、安装
$ npm i egg-init -g
$ egg-init egg-example --type=simple //egg提供的一款名为simple的模板
$ cd egg-example
$ npm i //安装依赖
2、项目目录的讲解
1、middleware 中间件定位是拦截用户的请求,如鉴权,安全检查,访问日志等;
2、extend 防止扩展文件,作用在于将一些常用的动作抽离在js文件内的一个独立的function ,可用js处理一些复杂的逻辑。
3、schedule 防止定时任务文件,如定时从远程api更新本地缓存,定时进行文件删除;
3、启动项目
//启动项目的命令
1、cnpm run start //用于实际项目
2、cnpm run dev //用于开发
npm run dev
然后浏览器打开http://localhost:7001 就可以看到 “hellow,egg” 字样说明运行成功。
"scripts": {
"dev": "egg-bin dev --host 192.168.6.58", // egg 使用ip访问
}
Config
运行环境配置
//config/config.{env}.js
--env = {env}
Extend
// app/extend/response.js
module.exports = {
set foo(value) {
this.set('x-response-foo', value);
},
};
this.response.body= 'bar'; => this.body= 'bar'; => this.response.foo = 'bar';
模板引擎
npm install egg-view-ejs -s
数据库(egg-mysql)
1、get 查找一条
let result = await this.app.mysql.get("user",{id:1})
2、查找数据的另一种方式
let result = await this.app.mysql.select("user",{
where:{id:1}
})
3、增加数据
let result = await this.app.mysql.insert("user",{username:"lisi",password:"1234"})
4、修改数据的第一种方式:根据主键修改
let result = await this.app.mysql.update('user',{ id:2, username:'赵四' });
//修改数据的第二种方式:通过 sql 来修改数据
let results=await this.app.mysql.query('update user set username = ? where id = ?',["王五",2]);
5、删除数据
let result= await this.app.mysql.delete('user',{ id:3 });
6、执行 sql
this.app.mysql.query(sql,values);
7、mysql 事务
const conn=await this.app.mysql.beginTransaction();
try{
await conn.insert('user',{'username':'xiao1','password':'1111'});
await conn.update('user',{id:2,username:'黑子'});
await conn.commit(); //提交事务
}catch(err){
await conn.rollback();//回滚事务
throw err;
}
VS插件
安装eggjs插件
egg controller //快速生成controller
egg service //快速生成service
egg config //快速生成config
egg plugin //快速生成plugin
问题解决
1. 安全威胁csrf的防范
报错信息:
invalid csrf token. See https://eggjs.org/zh-cn/core/security.html#安全威胁csrf的防范
nodejs.ForbiddenError: invalid csrf token
解决方案:
在 config/config.default.js 中新增
// 框架的安全插件是默认开启的,如果我们想关闭其中一些安全防范,直接设置该项的 enable 属性为 false 即可
config.security = {
csrf: {
enable: false,
},
};
基础编写
1、静态资源(images,css,js等文件)放到app/public 目录即可;
2、模板渲染:
绝大多数情况,我们都需要读取数据后渲染模板,然后呈现给用户。故我们需要引入对应的模板引擎。
1). 先安装对应的插件 egg-view-nunjucks :
$ npm i egg-view-nunjucks --save
2). 开启插件:
// config/plugin.js
exports.nunjucks = {
enable: true,
package: 'egg-view-nunjucks'
};
// config/config.default.js
// 添加 view 配置
exports.view = {
defaultViewEngine: 'nunjucks',
mapping: {
'.tpl': 'nunjucks',
},
};
基础语法
1、controller 中指向页面:
yield this.ctx.render(‘news/list.tpl’,datalist);
2、页面中循环:
<ul>
{% for item in list %}
<li>
<a href="{{item.url}}">{{item.title}}</a>
</li>
{% endfor %}
</ul>
3、控制器中获取动态路由:
1). router.js 中配置路由
router.get('/list/:id', controller.list.checkId);
2). controller 中获取路由参数
* checkId(){
const {ctx} = this;
ctx.body = `"您输入的是:"+${ctx.params.id}`;
}
浏览器:
4、控制器中传参给页面:
1). 控制器中定义参数的值
2). 页面获取参数
浏览器中:
5、自定义工具类及其引用方法:
1). 在 app目录下新建一个util的文件夹,这里用来放置公用类
2). 在 helper.js 中定义
3). 在controller 中的js文件里使用
浏览器:
6、获取路由中的参数
const { ctx } = this;
console.log(ctx.query) // 获取 ?id=123&name=***
console.log(ctx.params) // 获取 /123/***