【基础】eggjs安装+路由+控制器
安装
-
新建项目目录,进入其中,打开命令行
-
创建eggjs脚手架
npm init egg --type=simple- 或者用cnpm,不过生成的项目路径实在init文件夹下面?
-
输项目名称,一路回车,一百多秒后,成功,再安装依赖
cnpm install -
用vscode启动本项目
code .
-
-
vscode中安装eggjs插件
- 作用: 可以在文件内输 egg,等待,选中回车,自动生成 controller 文件或 service 文件等内部语句块
配置路由
找到目录下的app/router.js文件
-
verb 风格写法
router.verb("内部使用的别名可省略", "要匹配的路径",中间件, app.controller文件夹名.内部文件夹名.控制器名.控制器内的方法)-
其中verb可取:
- get 获取
- put 更改更新
- post 提交创建
- delete 删除
- del 删除的别名
- redirect 内部重定向 把最后一个参数改为302即可
-
控制器方法内可以外部重定向
ctx.redirect(`http://cn.bing.com/search?q=${q}`);
-
-
RESTful 风格写法
router.resources("内部使用的别名", "要匹配的路径",中间件, app.控制器文件夹名controller.内部文件夹名.控制器名.控制器内的方法)-
假设参数“要匹配的路径”为api/posts,则浏览器:
-
用GET访问:
- api/posts 默认调用index方法
- api/posts/new 默认调用new方法
- api/posts/123 默认调用show方法
- api/posts/123/edit 默认调用edit方法
-
用POST访问
- api/posts 默认调用create方法
-
用PUT访问
- api/posts/123 默认调用update方法
-
用DELETE访问
- api/posts/123 默认调用destroy方法
-
-
控制器内-获取数据
找到app/controller里面的js文件
-
params 风格获取参数
-
如果
- 路由定义为
api/news/:id/:name - 浏览器GET访问为
api/news/123/zhangsan
- 路由定义为
-
则控制器方法内
this.ctx.params.id可得到123 this.ctx.params.name可得到zhangsan
-
-
query 风格获取参数
-
如果
- 路由定义为
api/news - 浏览器GET访问为
api/news?id=123&name=zhangsan&name=lisi
- 路由定义为
-
则控制器方法内
this.ctx.query.id可得到123 this.ctx.query.name可得到zhangsan this.ctx.queries.name可得到["zhangsan","lisi"]
-
-
post 获取表单数据
-
如果
- 浏览器POST传递表单对象为
{ "id":"123", "name":"zhangsan" }
- 浏览器POST传递表单对象为
-
则控制器方法内
this.ctx.request.body 可得到原对象 -
这里直接发起 POST 请求会报错:'secret is missing'
- 【原因】框架中内置安全插件 egg-security,内部针对表单 POST 请求均会验证 CSRF 值,因此我们在表单提交时,请带上 CSRF key 进行提交,
- 【办法】可临时关闭csrf
-
控制器内-框架
-
两种写法:
- 从egg上获取(推荐)
const Controller = require('egg').Controller; class UserController extends Controller { } module.exports = UserController; - 从app 实例上获取
module.exports = app => { return class UserController extends app.Controller { }; };
- 从egg上获取(推荐)