场景

npm提供了大量的第三方模块,其中不乏许多Web框架,我们没有必要重复发明轮子,
因而选择使用Express作为开发框架,因为它是目前最稳定、使用最广泛,而且Node.js官
方推荐的唯一一个Web开发框架。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

安装Express

首先需要安装Express

npm install -g express

这里使用全局安装-g,然后还需要安装express-generator

npm install -g express-generator

然后可以通过

express --help

来查看相关帮助

新建Express工程

express -t ejs microblog

Express在初始化一个项目的时候需要指定模板引擎,默认支持Jade和ejs,这里使用ejs,同时暂时不添加CSS引擎和会话支持。

后面microblog是项目名,此时会生成此目录以及目录下文件

并且会提示我们进入其中并执行npm install

cd microblog
npm install

安装依赖成功。

启动服务器

打开项目下的app.js,发现并没有服务器的端口监听,加上如下代码

app.listen(3000,function () {console.log('服务端启动在3000端口')
})

然后启动服务器

node app.js

打开浏览器访问localhost:3000

新建路由规则

新建成的工程是自带一个users示例路由

所以直接访问

http://localhost:3000/users

就能直接访问到routes下的users.js中的响应内容

仿照示例路由首先在app.js,添加路由匹配

app.use('/badao', badaoRouter);

badaoRouter在上面声明

var badaoRouter = require('./routes/badao');

然后在routes目录下新建badao.js

var express = require('express');
var router = express.Router();/* GET users listing. */
router.get('/', function(req, res, next) {res.send('这是来自badao--公众号:霸道的程序猿');
});module.exports = router;

然后重启服务器,访问

http://localhost:3000/badao

路由规则匹配

有时需要根据传递的参数进行路由的匹配,比如传递名字,从而返回Hello+传递的名字参数。

在app.js中引入index根路由的方式是

app.use('/', indexRouter);

然后indexRouter是通过

var indexRouter = require('./routes/index');

在routes下index.js中

var express = require('express');
var router = express.Router();/* GET home page. */
router.get('/', function(req, res, next) {res.render('index', { title: 'Express' });
});router.get('/hello',function (req,res) {res.send('cunrrentTime is :'+new Date().toString())
});router.get('/hello/:username',function (req,res) {res.send('Hello:'+req.params.username);
});module.exports = router;

又新增了两个路由这样,就可以通过app.js的路由加上此index.js中的路由进行匹配。

比如这里的访问hello这个路由对应的方法

运行程序打开浏览器输入

http://localhost:3000/hello

除此之外还可以获取路由传递的参数进行动态显示

router.get('/hello/:username',function (req,res) {res.send('Hello:'+req.params.username);
});

使用:username来接受路由参数,进入响应Hello+参数。

启动程序,然后在浏览器中输入:

http://localhost:3000/hello/霸道的程序猿

控制权转移

Express支持同一路径绑定多个路由响应函数。但是当你访问这两条同样的规则匹配到的路径时,会发现请求总是

被前一条路由规则捕获,后面的规则会被忽略。原因是Express在处理路由规则时,会优先匹配先定义的路由规则,

因此后面的规则被屏蔽。

Express提供了路由控制权转移的方法,即回调函数的第三个参数next,通过调用next()将路由控制权交给后面的规则。

这让我们可以实现中间件,而且还能提高代码的复用程度。

例如针对用户查询信息和修改信息的操作,其中一个步骤是检查用户名是否存在,因此可以通过next()方法实现。

继续使用上面的获取路由参数的方式,在上面新增的路由badao.js中声明一个对象和设置属性值

var users = {'badao':{name:'badao',blog:'https://blog.csdn.net/BADAO_LIUMANG_QIZHI'}
}

然后新增两个同路径匹配的路由

router.all('/:username',function (req,res,next) {if(users[req.params.username]){next();}else{next(new Error(req.params.username+'不存在'))}
});
router.get('/:username',function (req,res) {res.send(JSON.stringify(users[req.params.username]));
});

上面两个路由首先走第一个验证传递的username参数是否存在,不存在则返回错误,提示则调用next进而将对象信息返回。

badao.js完整代码

var express = require('express');
var router = express.Router();
var users = {'badao':{name:'badao',blog:'https://blog.csdn.net/BADAO_LIUMANG_QIZHI'}
}
/* GET users listing. */
router.get('/', function(req, res, next) {res.send('这是来自badao--公众号:霸道的程序猿');
});router.all('/:username',function (req,res,next) {if(users[req.params.username]){next();}else{next(new Error(req.params.username+'不存在'))}
});
router.get('/:username',function (req,res) {res.send(JSON.stringify(users[req.params.username]));
});module.exports = router;

然后重新运行项目,打卡浏览器输入

http://localhost:3000/badao/bada

然后输入正确的名字参数

http://localhost:3000/badao/badao

示例代码下载

https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12969105

Express新建工程以及新建路由规则、匹配路由规则、控制权转移相关推荐

  1. web开发与django认识 MVC和MVT的区别 路由的匹配

    文章目录 一.web开发 1.简介 2.客户端服务器请求过程 3.web开发思维 二.Django 1.Django简介 2.Django与flask的优缺点 3.Django的环境安装 4.virt ...

  2. 【TP3.2】路由匹配和规则

    TP3.2框架的路由匹配和规则处理: 包括:静态路由,动态路由,多参数路由.正则路由 <?php return array(//'配置项'=>'配置值'/* * 路由开启和匹配.首先开启路 ...

  3. 后端——egg.js是什么、egg.js安装、约定规则、路由Router、控制器Controller、跨域

    目录 一.egg.js是什么 二.egg安装 三.约定规则 四.路由Router 五.控制器Controller 六.跨域 1.egg-cors 1.下载 2.开启插件 3.配置插件 4.使用: 2. ...

  4. 动态匹配路由的基本用法||路由组件传递参数

    动态匹配路由的基本用法 <!DOCTYPE html> <html lang="en"><head><meta charset=" ...

  5. [svc]二三层数据格式三层数据如何匹配路由

    网络知识拾遗 tcpip的4&7层模型 PDU数据包在不同层的不同称呼 物理层(一层)PDU指数据位(Bit). 数据链路层(二层)PDU指数据帧(Frame). 网络层(三层)PDU指数据包 ...

  6. php yii路由规则,Yii2 路由基本配置

    Yii2 支持以下几种路由格式: ```php /index.php?r=post%2Fview&id=100 /index.php/post/100 /posts/100 ``` 其中第一个 ...

  7. ACL和RouteMap的permit和deny规则在路由重分配时的动作

    A –--- B 两台路由器通过E1/1接口直联,运行OSPF. A路由器配置3条静态路由: ip route 7.0.0.0 255.0.0.0 Ethernet1/1 ip route 8.0.0 ...

  8. IP路由基础、路由器静态路由配置方法、自治系统、缺省路由的配置方法、路由选路规则、缺省路由、备份路由、等价路由、三种查询路由表命令

    目录 路由器特点: 网络IP地址规划 网络间的特性: 基本路由思想: ​编辑 静态路由部分: 查询设备整个路由表: 查看特定的路由协议时使用: 查询目的地址2.2.2.2的路由条目: IP路由表代码写 ...

  9. nodejs之express路由与动态路由

    1.快速创建express项目步骤 /*** 1.cd 到项目里面* 2.npm init --yes 创建package.json文件* 3.安装express* npm install expre ...

最新文章

  1. 解决 centos7 最小化安装之后不能正常联网问题
  2. Bzoj4561 [JLoi2016]圆的异或并
  3. HDU - 4565 So Easy!(共轭构造+推公式+矩阵快速幂)
  4. spring-注解---IOC(3)
  5. UVA11525 Permutation 逆康托展开
  6. Leetcode —— 208. 实现 Trie (前缀树)(Python)
  7. LTE网络测试仪器和监控系统
  8. 统计自然语言处理梳理一:分词、命名实体识别、词性标注
  9. 【免费】自动检测删除微信好友教程 微信一键清死粉
  10. 俄罗斯决定退出国际空间站项目 马斯克:“一路顺风”
  11. RT throttling分析【转】
  12. vue3 Component inside <Transition> renders non-element root node that cannot be animated.
  13. mac电脑装虚拟机遇到的坑!
  14. 计算机缩写术语完全介绍 By 001pc @ 1997.10.1-2004-6-12
  15. 使用 pandas 做数据可视化
  16. 安全:屏蔽恶意网站 恶意网址库
  17. K8s第七篇授权认证
  18. 无线网卡、无线模块和无线模组的区别
  19. Docker:MacOS环境下修改容器的端口号
  20. 博士申请 | 香港中文大学岳翔宇老师招收人工智能全奖博士/博后/RA/实习生

热门文章

  1. 关于Dockerfile那些事: 基础镜像的坑
  2. SpringMVC学习(五)——零配置实现SpringMVC
  3. vue-admin项目启动踩过的坑
  4. shiro基于url权限认证时doGetAuthorizationInfo方法不运行的解决办法
  5. JavaWeb入门篇(6) 实现字符过滤器 解决全局字符乱码 实现模拟权限拦截
  6. 计算机不会输入函数怎么办,函数不正确_电脑上文件打不开,显示函数不正确怎么解决?...
  7. linux系统改ip地址 永久生效,Linux修改IP永久生效
  8. mysql double 使用_mysql使用double的坑
  9. pytorch保存模型pth_Day159:模型的保存与加载
  10. python sftp模块_python实现ssh及sftp功能(实例代码)