首页 > 其他分享 >路由与控制器

路由与控制器

时间:2023-02-05 17:47:32浏览次数:50  
标签:index 控制器 get app controller fruits router 路由

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次

标签:index,控制器,get,app,controller,fruits,router,路由
From: https://www.cnblogs.com/ben10044/p/17093682.html

相关文章

  • RBMQ案例四:路由模式
      使仅订阅消息的子集成为可能。例如,我们将能够仅将关键错误消息定向到日志文件(以节省磁盘空间),同时仍然能够在控制台上打印所有日志消息。 通过路由来匹配对应的......
  • TP-LINK 路由器密码加密方法
       functionorgAuthPwd(a){returnthis.securityEncode(a,"RDpbLfCPsJZ7fiv","yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD......
  • 深入理解前端中的 hash 和 history 路由
    我们在使用Vue或者React等前端渲染时,通常会有hash路由和history路由两种路由方式。hash路由:监听url中hash的变化,然后渲染不同的内容,这种路由不向服务器发送......
  • ASP.NET Core Web API 中控制器操作的返回类型
    ASP.NETCoreWebAPI中控制器操作的返回类型ASP.NETCore为WebAPI控制器操作返回类型提供以下选项:特定类型IActionResultActionResult<T>HttpResults特定类......
  • vue.js客服系统实时聊天项目开发(二十二)vue项目中router.js路由介绍
    vue项目的路由就相当于我们在网址url上输入的地址,访问的具体网址就是路由拿到项目先看看路由文件,就能知道具体的访问地址了例如下面的router.jsimportVuefrom'vue'......
  • vue的路由的注意点
    2.vue路由-声明式导航2.0声明式导航-基础使用目标:可用全局组件router-link来替代a标签vue-router提供了一个全局组件router-linkrouter-link实质上最终会......
  • 【云原生kubernetes】k8s控制器Deployment使用详解
    前言在上一篇我们聊了k8s中各种控制器的使用,本篇将以控制器中比较常用的一种控制器Deployment进行详细的说明。一、Deployment简介 为了更好解决服务编排的问题,kubernete......
  • drf之路由Routers
    #2.路由Routers对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。如果是非视图集,不需......
  • 基于MATLAB的一级倒立摆控制仿真,带GUI界面操作显示倒立摆动画,控制器控制输出
    1.算法描述      一个可以活动的小车上立着一根不稳定随时会倒下的杆。小车的轮子由电机控制,可以控制小车电机的转动力矩M。同时,也可以获取小车轮子转动的圈数N(可以......
  • 路由的使用
               ......