路由与控制器

MVC概述

Egg中的控制器controller


fruits.js

const Controller = require("egg").Controller;//引入Controller类

class FruitsController extends Controller {

    async index(){//index方法
        this.ctx.body = "我是一个水果列表页面" //上下文对象ctx,.body是其响应的内容
    }
}

module.exports = FruitsController;

设置路由
router.js

'use strict';

/**
 * @param {Egg.Application} app - egg application
 */
//router描述了路由与控制器的对应关系
module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.index);//'/'是首页,对应controller目录下的home.js的index方法
  router.get('/fruits',controller.fruits.index);
};

访问

egg中的路由

app/router.js

'use strict';//严格模式

/**
 * @param {Egg.Application} app - egg application
 */
//router描述了路由与控制器的对应关系
module.exports = app => { //暴露一个函数,该函数有个形参app,app也是整个Egg应用的实例
  const { router, controller } = app;//通过解构赋值拿到app下面的router的对象和controller的对象
  router.get('/', controller.home.index);//'/'是首页,对应controller目录下的home.js的index方法
  router.get('/fruits',controller.fruits.index);
};

路由传递参数

获取query参数

获取get请求参数,与koa类似

const Controller = require("egg").Controller;

class FruitsController extends Controller {

    async index(){
        let query = this.ctx.request.query;
        //this.ctx.request是请求的对象,它的query对象能拿到url的参数
        console.log(query);//如{index:100}
        this.ctx.body = `传递的index值是${query.index}`//query对象的index属性
    }
}

module.exports = FruitsController;

?index=100是发送一个get请求

cmd中

获取params参数

即/:id
fruits.js

const Controller = require("egg").Controller;

class FruitsController extends Controller {

    async index(){
        let query = this.ctx.request.query;
        //this.ctx.request是请求的对象,它的query对象能拿到url的参数
        console.log(query);//如{index:100}
        this.ctx.body = `传递的index值是${query.index}`//query对象的index属性
    }

    async getId(){
        let id = this.ctx.params.id;//获取地址后面的id,如127.0.0.1/7001/fruits/1
        this.ctx.body = `传递的id是:${id}`;
    }
}

module.exports = FruitsController;

router.js

'use strict';//严格模式

/**
 * @param {Egg.Application} app - egg application
 */
//router描述了路由与控制器的对应关系
module.exports = app => { //暴露一个函数,该函数有个形参app,app也是整个Egg应用的实例
  const { router, controller } = app;//通过解构赋值拿到app下面的router的对象和controller的对象
  router.get('/', controller.home.index);//'/'是首页,对应controller目录下的home.js的index方法
  router.get('/fruits',controller.fruits.index);
  router.get('/fruits/:id',controller.fruits.getId);
};

获取post请求

fruits.js

const Controller = require("egg").Controller;

let fruitList = ["苹果","香蕉","鸭梨"];
class FruitsController extends Controller {

    async index(){
        this.ctx.body = fruitList;
    }

    async createPage(){
        this.ctx.body = `
            <form method='post' action='/createfruit'>
                <input name='fruitname'>
                <button>添加</button>
            </form>
        `;
    }

    async createFruit(){
        let fruit = this.ctx.request.body;//获取post请求对象
        fruitList.push(fruit.fruitname);//fruit对象的fruitname属性才是字符串
        this.ctx.body = "添加成功"
    }
}

module.exports = FruitsController;

router.js

'use strict';//严格模式

/**
 * @param {Egg.Application} app - egg application
 */
//router描述了路由与控制器的对应关系
module.exports = app => { //暴露一个函数,该函数有个形参app,app也是整个Egg应用的实例
  const { router, controller } = app;//通过解构赋值拿到app下面的router的对象和controller的对象
  router.get('/', controller.home.index);//'/'是首页,对应controller目录下的home.js的index方法
  router.get('/fruits',controller.fruits.index);
  // router.get('/fruits/:id',controller.fruits.getId);
  router.get('/createfruit',controller.fruits.createPage);
  router.post('/createfruit',controller.fruits.createFruit);
};


点击添加后

egg默认拦截post请求,要修改配置
到config.default.js
在return上面添加以下代码

config.security = {
    csrf: {
      enable:false,
    },
  };

现在就能进行post请求了

回到fruits页

restful风格的url定义

上面的写法有些繁琐,egg提供了简写的方式

fruits.js

const Controller = require("egg").Controller;

let fruitList = ["苹果","香蕉","鸭梨"];
class FruitsController extends Controller {

    async index(){
        this.ctx.body = fruitList;
    }

    async new(){
        this.ctx.body = `
            <form method='post' action='/fruits'>
                <input name='fruitname'>
                <button>添加</button>
            </form>
        `;
        //action那改成/fruits是因为确保表单提交到create方法的相同路径
    }

    async create(){
        let fruit = this.ctx.request.body;
        fruitList.push(fruit.fruitname);
        this.ctx.redirect("/fruits")//回到fruits页
    }

    async update(){}//改

    async destroy(){}//删
}

module.exports = FruitsController;

router.js

'use strict';//严格模式

/**
 * @param {Egg.Application} app - egg application
 */
//router描述了路由与控制器的对应关系
module.exports = app => { //暴露一个函数,该函数有个形参app,app也是整个Egg应用的实例
  const { router, controller } = app;//通过解构赋值拿到app下面的router的对象和controller的对象
  router.get('/', controller.home.index);//'/'是首页,对应controller目录下的home.js的index方法
  // router.get('/fruits',controller.fruits.index);
  // // router.get('/fruits/:id',controller.fruits.getId);
  // router.get('/createfruit',controller.fruits.createPage);
  // router.post('/createfruit',controller.fruits.createFruit);
  //通过一行设置实现多个请求
  router.resources('fruits','/fruits',controller.fruits)
  /*'fruits'是接口即controller里的js文件,'/fruits'是路径即图中的/posts的指代,
  增删改查的操作路径都在此基础上,controller.fruits是控制器fruits
  这个方法即写好控制器的对应方法访问对应的path以实现对应的请求
  */
};




注意一点,同一个地址get请求和post请求也是两个页面
将create方法改下,注释掉重定向以保留post页面

初始列表

添加一次西瓜

此时虽然url里变成了/fruits但还是post页,如果按下回车才是get请求到/fruits页
按回车

回到new,试下再刷新,会再post请求一次
添加芒果


刷新

按确定,然后回到fruits页

发现有两个芒果,说明post请求了2次

posted @ 2023-02-05 17:32  ben10044  阅读(23)  评论(0编辑  收藏  举报