Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

【基础】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"
        }
        
    • 则控制器方法内

      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 {
      
        };
      };