node_egg路由Router

路由(Router)

框架约定了app/router.js文件用于统一所有路由规则。
Router 主要用来描述请求URL和具体承担执行动作的 Controller 的对应关系

定义路由(Router)

  // app/router.js 里面定义 URL 路由规则
  module.exports = app => {
    const { router, controller } = app;
    router.get(‘/user/:id‘, controller.user.info); // 动态路由传参
  };
  // app/controller 目录下面实现 Controller
  // app/controller/user.js
  class UserController extends Controller {
    async info() {
      this.ctx.body = `hello ${ctx.params.id}`, 使用params接收
    }
  }
Router详细定义说明,完整路由定义包括5个主要部分
router.verb(‘path-match‘, app.controller.action);
router.verb(‘router-name‘, ‘path-match‘, app.controller.action);
router.verb(‘path-match‘, middleware1, ..., middlewareN, app.controller.action);
router.verb(‘router-name‘, ‘path-match‘, middleware1, ..., middlewareN, app.controller.action);
1. verb: 用户触发动作,get,post等所有HTTP方法
2. router-name: 给路由取一个别名,可以通过 Helper 提供的辅助函数 pathFor 和 urlFor 来生成 URL
3. path-match: 路由URL路径
4. middleware1: 在router里面可以配置多个中间件
5. controller: 指定路由映射到具体的controller上

注意事项

1. 在router定义中,可以支持多个middleware(中间件)
2. controller必须定义在app/controller目录中
3. 一个文件中可以包含多个Controller定义,定义路由的时候可以通过${fileName}.${functionName}的方式指定对应的controller
4. Controll支持子目录,可以通过${directoryName}.${fileName}.${functionName}的方式获取
// app/router.js
module.exports = app => {
  const { router, controller } = app;
  router.get(‘/home‘, controller.home);
  router.get(‘/user/:id‘, controller.user.page); // 动态路由,可以接收参数id
  router.post(‘/admin‘, isAdmin, controller.admin);
  router.post(‘/user‘, isLoginUser, hasAdminPermission, controller.user.create);
  router.post(‘/api/v1/comments‘, controller.v1.comments.create); // app/controller/v1/comments.js
};

参数获取

Query String方式
// app/router.js
module.exports = app => {
  app.router.get(‘/search‘, app.controller.search.index);
};
// app/controller/search.js
exports.index = async ctx => {
  ctx.body = `searchInfo: ${ctx.query.name}`; // => ‘searchInfo: egg‘
};

// curl http://127.0.0.1:7001/search?name=egg
参数命名方式(动态路由)
// app/router.js
module.exports = app => {
  app.router.get(‘/user/:id/:name‘, app.controller.user.info);
};

// app/controller/user.js
exports.info = async ctx => {
  ctx.body = `userInfo: ${ctx.params.id}, ${ctx.params.name}`; // => ‘userInfo: 123, xiaoming‘
};

// curl http://127.0.0.1:7001/user/123/xiaoming
表单内容的获取
// app/router.js
module.exports = app => {
  app.router.post(‘/form‘, app.controller.form.post);
};

// app/controller/form.js
exports.post = async ctx => {
  ctx.body = `body: ${JSON.stringify(ctx.request.body)}`;
};
// 模拟发起post请求
let options = {
  url: ‘/form‘,
  method: ‘post‘,
  data: {name: ‘jack‘, age: 18},
  headers: {‘Content-Type‘: ‘application/json‘}
}
axios(options).then(data=> {console.log(data)})
//=> ‘body: {name: ‘jack‘, age: 18}‘ promise对象

// 注意,这里直接发起post请求会报错
// 原因:框架内部针对表单POST请求均会验证CSRF的值,因此我们在表单提交时,请带上CSRF key 进行提交
// 校验是因为框架中内置了安全插件egg-security,提供了一些安全的实践,默认是开启的,
// 详情查看:https://eggjs.org/zh-cn/core/security.html#安全威胁csrf的防范
// 如果需要关闭其中一些安全防范,直接设置该项的 enable 属性为 false 即可
// config/config.default.js
exports.security = {
  csrf: false
};

重定向

内部重定向
// app/router.js
module.exports = app => {
  app.router.get(‘/home/index‘, app.controller.home.index);
  app.router.redirect(‘/‘, ‘/home/index‘, 302); //根路由重定向/home/index路由
};
// app/controller/home.js
exports.index = async ctx => {
  ctx.body = ‘hello controller‘;
};
// curl -L http://localhost:7001
外部重定向
// app/router.js
module.exports = app => {
  app.router.get(‘/search‘, app.controller.search.index);
};
// app/controller/search.js
exports.index = async ctx => {
  const type = this.ctx.request.query.type;
  const q = this.ctx.request.query.q || ‘node.js‘;
  if (type === ‘bing‘) {
    this.ctx.redirect(`http://localhost:7001/home/index?q=${q}`);
  } else {
    this.ctx.redirect(`http://localhost:7001/user/123/jack?q=${q}`);
  }
};

// curl http://localhost:7001/search?type=bing&q=node.js
// curl http://localhost:7001/search?q=node.js

多路由映射

// app/router.js
module.exports = app => {
  require(‘./router/news‘)(app);
  require(‘./router/admin‘)(app);
};

// app/router/news.js
module.exports = app => {
  app.router.get(‘/news/list‘, app.controller.news.list);
  app.router.get(‘/news/detail‘, app.controller.news.detail);
};

// app/router/admin.js
module.exports = app => {
  app.router.get(‘/admin/user‘, app.controller.admin.user);
  app.router.get(‘/admin/log‘, app.controller.admin.log);
};

原文地址:https://www.cnblogs.com/JunLan/p/12576328.html

时间: 2024-10-07 10:24:17

node_egg路由Router的相关文章

Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现

前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Schema的使用(Android业务组件化之URL Schema使用),今天重点来聊下子模块SubModule的拆分以及它们之间的路由Router实现.本篇涉及的相关知识比较多,阅读本篇之间需要大致了解一下Java的注解(Java学习之注解Annotation实现原理).Java的动态代理机制(Java设计模式之代理模式(Proxy))等.业务组件化是一个循序渐进的过程,一开始很难

vue_路由Router

使用路由 Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌 安装 vue项目创建时选择使用路由,项目将自动在根实例中注册 router 选项, 该 router 实例会注入到根组件下的所有子组件中,且子组件能通过 this.$router 访问到 假设vue项目创建没有选择使用路由,手动将路由注册到根实例中 $ npm install vue-router --save 手动创建目录 src/router/index.js

angular 路由router的用法总结

1,html页面 <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, 

docker的cli的路由router

写过应用框架的都应该知道有个路由模块,来看看docker的http请求是怎么路由的 docker的server.go文件中,首先入口是New的时候 func New(cfg *Config) *Server {         //需要创建Server的实例,因为命令的具体执行都是Server对象的函数   srv := &Server{ cfg:   cfg, start: make(chan struct{}), } //这里就是创建Router的操作 r := createRouter(s

6.1 路由router

路由将信息由源地址传递到目的地的一种角色. 一.路由简单应用举个例子: let express=require('express'); let app=express(); app.use(express.static('public')); // GET /home 显示 网站首页 app.get('/home',function(req,res){ res.setHeader('content-type','text/html;charset=utf-8'); res.end('网站首页')

vue路由-router

VueRouter基础 vue路由的注册 导入 <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> # 可以是下载之后的 <script src="vue.min.js"></script> <script src="vue-router.js"></script> 定义一个匹配规则对

Vue的路由Router之导航钩子和元数据及匹配

一.文件结构 二.vue.js 打开此链接 https://cdn.bootcss.com/vue/2.6.10/vue.js 复制粘贴页面的所有内容 三.vue-router.js 打开此链接  https://cdn.bootcss.com/vue-router/3.0.6/vue-router.js 复制粘贴页面的所有内容 四.index.html 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4

Vue:路由router的一些用法

Vue-router的引入 分为两种方式: 1.通过npm 引入vue-router库 npm install vue-router 在模块中通过下面的方法使用 import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) 2.直接通过script标签引入vue-router.js文件 如果是通过script标签引入,则直接使用即可. 下载地址 router的使用 var routes = [ { path

路由Router

基本使用 from booktest import views # 1. 创建Router对象 from rest_framework.routers import SimpleRouter router = SimpleRouter() # 2. 注册视图集 router.register('books', views.BookInfoViewSet, base_name='books') # 3. 打印生成的url配置项 for url in router.urls: print(url)