express高效入门教程(3)
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)的更多相关文章
- express高效入门教程(5)
5.ejs模版 5.1.什么是模版引擎? 为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档. 在后端开发中,处理数据的代码和展示 ...
- express高效入门教程(4)
4.静态文件 4.1.普通处理静态文件的方法 在./views/index.html文件中去引入另一个css文件index.css,index.css文件放在public/css目录下,目录结构是这样 ...
- express高效入门教程(2)
2.请求和响应 2.1.请求相关 2.1.1.返回一个html页面 // 注意path模块需要先引入 app.get('/', function (req, res){ res.sendFile(pa ...
- express高效入门教程(1)
1.hello world 1.1.安装express // 1.进入到自己的项目目录, 我这里是express-demo cd express-demo // 2.初始化项目,生成package.j ...
- 2.Tensor Shape《Pytorch神经网络高效入门教程》Deeplizard
,之后,我们张量和基础数据的形状酱油卷积运算来改变. 卷积改变了高度和宽度维度以及颜色通道的数量.
- 1.数据结构《Pytorch神经网络高效入门教程》Deeplizard
当移动一个数组或向量时,我们需要一个索引:二维数组/矩阵需要两个索引, 比如说标量是零维张量,数组/向量/矢量是一维张量,矩阵是是二维张量,n维数组是n维张量. 如果我们被告知, 假设有一个张量t, ...
- gulp详细入门教程
本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...
- React入门教程1---初见面
React入门教程1---初见面:https://blog.csdn.net/solar_lan/article/details/82799248 React 教程 React 是一个用于构建用户界面 ...
- webpack入门教程之初识loader(二)
上一节我们学习了webpack的安装和编译,这一节我们来一起学习webpack的加载器和配置文件. 要想让网页看起来绚丽多彩,那么css就是必不可少的一份子.如果想要在应用中增加一个css文件,那么w ...
随机推荐
- 分布式事务专题笔记(三)分布式事务解决方案之TCC(三阶段提交)
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.什么是TCC事务 TCC是Try.Confifirm.Cancel三个词语的缩写,TCC要求每个分支 ...
- Java实现 蓝桥杯 算法训练 p1103
算法训练 P1103 时间限制:1.0s 内存限制:256.0MB 编程实现两个复数的运算.设有两个复数 和 ,则他们的运算公式为: 要求:(1)定义一个结构体类型来描述复数. (2)复数之间的加法. ...
- Java实现 蓝桥杯 历届试题 小数第n位
历届试题 小数第n位 时间限制:1.0s 内存限制:256.0MB 问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的 ...
- Java实现 LeetCode 440 字典序的第K小数字
440. 字典序的第K小数字 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 注意:1 ≤ k ≤ n ≤ 109. 示例 : 输入: n: 13 k: 2 输出: 10 解释: ...
- Java实现 蓝桥杯VIP 算法训练 确定元音字母位置
算法训练 确定元音字母位置 时间限制:1.0s 内存限制:512.0MB 输入一个字符串,编写程序输出该字符串中元音字母的首次出现位置,如果没有元音字母输出0.英语元音字母只有'a'.'e'.'i'. ...
- java解决poi导出excel文字水印,导出excel不可操作问题
首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...
- PMBOK 基础知识(1)
启动.结束过程 项目管理计划 第一章 引论 第2章项目运行环境 第3章 项目经理的角色 第4章 项目整合管理 第5章 项目范围管理 第6章 项目进度管理 第7章 项目成本管理 第8章 项目质量管理 ...
- Dedecms 修改当前位置样式
当前列表页间隔符样式修改 后台-->系统基本参数-->核心设置-->栏目位置的间隔符号 只有二级位置栏目时的间隔符去除 找到include文件中的typelink.class.php ...
- Python实现DPABI当中“DICOM Sorted”功能
1. 前言 在对DICOM数据预处理之前很重要的一步是将扫描得到的文件按照不同的扫描序列区分开来.DPABI和PANDA工具包中已经提供了相应的功能模块.但由于是集成的模块,不容易及逆行扩展和调整.这 ...
- SpringCloud Alibaba (一):序言
为什么要转用SpringCloud Alibaba? Spring Cloud Netflix项目进入维护模式 在2018年底时,Netflix宣布Hystrix进入维护模式.自2016年以来,Rib ...