3.路由

路由到底是什么呢?不管官方定义到底是什么,咱通俗的说就是根据不同的url,执行不同的代码,类似于编程语言中的分支结构

3.1.express规划路由

稍微复杂点的应用,通常都是分模块进行的,例如:

我们从中挑选几个模块进行路由规划,在我们的后台模块里面,可以实现用户的管理,课程的管理,友情链接管理等,我们的访问地址可能是这样的

// 1.用户管理
// 用户列表
http://localhost:8090/admin/user/list
// 添加用户
http://localhost:8090/admin/user/add
// 删除用户
http://localhost:8090/admin/user/delete
// 编辑用户
http://localhost:8090/admin/user/edit // 2.课程管理
// 课程列表
http://localhost:8090/admin/course/list
// 添加用户
http://localhost:8090/admin/course/add
// 删除用户
http://localhost:8090/admin/course/delete
// 编辑用户
http://localhost:8090/admin/course/edit ...

在没有拆分路由的情况下,我们需要在app.js里面写这些代码

/**
* 用户管理模块
*/
app.get('/admin/user/list', function (req, res) {
res.send('用户列表')
})
app.get('/admin/user/add', function (req, res) {
res.send('添加用户')
})
app.get('/admin/user/delete', function (req, res) {
res.send('删除用户')
})
app.get('/admin/user/edit', function (req, res) {
res.send('更新用户')
}) /**
* 课程模块
*/
app.get('/admin/course/list', function (req, res) {
res.send('课程列表')
})
app.get('/admin/course/add', function (req, res) {
res.send('添加课程')
})
app.get('/admin/course/delete', function (req, res) {
res.send('删除课程')
})
app.get('/admin/course/edit', function (req, res) {
res.send('更新课程')
})

当上面的代码都写到app.js中,代码会显得非常臃肿,最佳的实践是把这些模块拆分出去,express中提供了拆分的方法

第一步,我们在项目根目录下面,新建一个router目录,在这个目录下面按模块名字分别创建user.js和course.js

第二步,在user.js文件中,创建router,并导出

var express = require('express')
var router = express.Router() // ... 中间写对应的路由方法 module.exports = router

第三步,把对应的路由方法添加到user.js中

var express = require('express')
var router = express.Router() router.get('/admin/user/list', function (req, res) {
res.send('用户列表')
})
router.get('/admin/user/add', function (req, res) {
res.send('添加用户')
})
router.get('/admin/user/delete', function (req, res) {
res.send('删除用户')
})
router.get('/admin/user/edit', function (req, res) {
res.send('更新用户')
}) module.exports = router

经过前面步骤,我们完成了user模块路由拆分

接下来,我们可以按照这种方式,把course模块拆分出来

// course.js文件代码

var express = require('express')
var router = express.Router() router.get('/admin/course/list', function (req, res) {
res.send('课程列表')
})
router.get('/admin/course/add', function (req, res) {
res.send('添加课程')
})
router.get('/admin/course/delete', function (req, res) {
res.send('删除课程')
})
router.get('/admin/course/edit', function (req, res) {
res.send('更新课程')
}) module.exports = router

当我们各个路由模块都拆分完成后,如何使用这些模块呢?

在app.js中,我们需要引入创建好的路由模块

var userRouter = require('./router/user')
var courseRouter = require('./router/course')

接下来,挂载到express上

app.use('/', userRouter)
app.use('/', courseRouter)

经过以上步骤,我们已经把路由模块完全拆分出去了

3.2.对路由模块进行多级拆分

前面我们已经把模块划分出来了,我们在写路由方法的时候是这样的:

router.get('/admin/user/list', function (req, res) {
res.send('用户列表')
})

从代码中我们可以看成,写路径的时候会写一长串,/admin/user/list,这样写比较麻烦,同时,我们更希望大模块直接有更好的划分,例如,我们的系统总体上划分为前台模块和后台模块,那我们的router目录组织结构应该是这样的:

admin文件夹下面放的都是关于后台路由的模块,home目录下面放的都是前台路由的模块,这个时候,我们需要对路由做进一步拆分,以拆分admin为例:

第一步:在admin/index.js下面 引入其他admin下面的模块,把其他admin下面的模块都挂在index.js这个模块上然后导出

var express = require('express')
var router = express.Router()
var course = require('./course')
var user = require('./user') // 挂载user模块
router.use('/', user)
// 挂载course模块
router.use('/', course) module.exports = router

第二步:在app.js中引入admin模块

var adminRouter = require('./router/admin/index')

第三步:把adminRouter挂到app对象上

app.use('/admin', adminRouter)

第四步:需要注意,user.js模块中的请求路径需要改变,例如:原来的"/admin/user/list"这种写法,需要改成这种"/user/list"

最终的路由分级如下图

3.3.动态路由

动态路由就是路由是动态不固定的,例如:

http;//localhost:8090/user/1
http;//localhost:8090/user/2
http;//localhost:8090/user/3

上面的几个url中,都是去访问某个user,前面部分(http;//localhost:8090/user)是相同的,不同的就是后面的部分

在后台我们怎么去监听这种形式的url呢?我们可以弄一个变量来匹配这些不同的部分,例如:

app.get('/user/:id', function (req, res) {
console.log(req.params)
})

这其中的id就存储了url中变化的部分

/user/1   id: 1
/user/2 id: 2
/user/3 id: 3

可以通过req.params.id打印出每次请求的动态部分(动态参数)

螺钉课堂视频课程地址:http://edu.nodeing.com

express高效入门教程(3)的更多相关文章

  1. express高效入门教程(5)

    5.ejs模版 5.1.什么是模版引擎? 为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在后端开发中,处理数据的代码和展示 ...

  2. express高效入门教程(4)

    4.静态文件 4.1.普通处理静态文件的方法 在./views/index.html文件中去引入另一个css文件index.css,index.css文件放在public/css目录下,目录结构是这样 ...

  3. express高效入门教程(2)

    2.请求和响应 2.1.请求相关 2.1.1.返回一个html页面 // 注意path模块需要先引入 app.get('/', function (req, res){ res.sendFile(pa ...

  4. express高效入门教程(1)

    1.hello world 1.1.安装express // 1.进入到自己的项目目录, 我这里是express-demo cd express-demo // 2.初始化项目,生成package.j ...

  5. 2.Tensor Shape《Pytorch神经网络高效入门教程》Deeplizard

            ,之后,我们张量和基础数据的形状酱油卷积运算来改变. 卷积改变了高度和宽度维度以及颜色通道的数量.

  6. 1.数据结构《Pytorch神经网络高效入门教程》Deeplizard

    当移动一个数组或向量时,我们需要一个索引:二维数组/矩阵需要两个索引, 比如说标量是零维张量,数组/向量/矢量是一维张量,矩阵是是二维张量,n维数组是n维张量. 如果我们被告知,  假设有一个张量t, ...

  7. gulp详细入门教程

    本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...

  8. React入门教程1---初见面

    React入门教程1---初见面:https://blog.csdn.net/solar_lan/article/details/82799248 React 教程 React 是一个用于构建用户界面 ...

  9. webpack入门教程之初识loader(二)

    上一节我们学习了webpack的安装和编译,这一节我们来一起学习webpack的加载器和配置文件. 要想让网页看起来绚丽多彩,那么css就是必不可少的一份子.如果想要在应用中增加一个css文件,那么w ...

随机推荐

  1. Java实现 LeetCode 801 使序列递增的最小交换次数 (DP)

    801. 使序列递增的最小交换次数 我们有两个长度相等且不为空的整型数组 A 和 B . 我们可以交换 A[i] 和 B[i] 的元素.注意这两个元素在各自的序列中应该处于相同的位置. 在交换过一些元 ...

  2. Java实现 LeetCode 1162 地图分析(可以暴力或者动态规划的BFS)

    1162. 地图分析 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远 ...

  3. Java实现 LeetCode 131 分割回文串

    131. 分割回文串 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: [ ["aa ...

  4. java实现第五届蓝桥杯年龄巧合

    年龄巧合 小明和他的表弟一起去看电影,有人问他们的年龄.小明说:今年是我们的幸运年啊.我出生年份的四位数字加起来刚好是我的年龄.表弟的也是如此.已知今年是2014年,并且,小明说的年龄指的是周岁. 请 ...

  5. java实现第七届蓝桥杯冰雹数

    题目8.冰雹数 题目描述 任意给定一个正整数N, 如果是偶数,执行: N / 2 如果是奇数,执行: N * 3 + 1 生成的新的数字再执行同样的动作,循环往复. 通过观察发现,这个数字会一会儿上升 ...

  6. 数据结构:用实例分析ArrayList与LinkedList的读写性能

    目录 背景 ArrayList LinkedList 实例分析 1.增加数据 2.插入数据 3.遍历数据 3.1.LinkedList遍历改进 总结 背景 ArrayList与LinkedList是J ...

  7. PAT 换个格式输出整数

    让我们用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n,换个格式来输出任一个不超过 3 位的正整数.例如 234 应该被输出为BBSSS1234,因为它有 ...

  8. HttpClient 常用方法封装

    简介 在平时写代码中,经常需要对接口进行访问,对于 http 协议 rest 风格的接口请求,大多使用 HttpClient 工具进行编写,想着方便就寻思着把一些常用的方法进行封装,便于平时快速的使用 ...

  9. Stylus 之 网教通直播间整修

    暗色模式 效果 Mozilla 格式源代码 @-moz-document domain("fj.101.com") { * { transition: all .3s; } #wj ...

  10. foreach 集合又抛经典异常了,这次一定要刨根问底

    一:背景 1. 讲故事 最近同事在写一段业务逻辑的时候,程序跑起来总是报:集合已修改:可能无法执行枚举操作,硬是没有找到什么情况下会导致这个异常产生,就让我来找一下bug,其实这个异常在座的每个程序员 ...