一:express框架学习之路由控制与中间件

文章是根据网上的知识点,自己整合了一下。


我们输入www.baidu.com 来访问百度的主页,浏览器会自动转换为http://www.baidu.com:80/(省略一些参数)http://代表我们同服务器连接使用的是http协议,www.baidu.com 代表的是服务器的主机地址,会被我们的pc通过DNS解析为IP地址。80是默认的应用层端口。/ 即为我们访问的服务器(www.baidu.com)的路径,服务器要对我们访问的这个路径做出响应,采取一定的动作。我们可以把这一过程看做一个路由。

 

 访问的路径‘/’即为router的路径,服务器采取的动作即为middleware,即为一个个特殊的函数。

中间件:

express应用其实就是由一系列顺序执行的Middleware中间件组成。所谓中间件,就是在收到请求后和发送响应之前这个阶段执行的一些函数。

要在一条路由的处理链上插入中间件,可以使用express对象的use方法。该方法原型如下:

app.use([path,] function [, function...])

app.use没有提供path参数时,路径默认为“/”。当你为某个路径安装了中间件,则当以该路径为基础的路径被访问时,都会应用该中间件。比如你为“/abcd”设置了中间件,那么“/abcd/xxx”被访问时也会应用该中间件。

中间件函数的原型如下:

function (req, res, next)

第一个参数是Request对象req。第二个参数是Response对象res。第三个则是用来驱动中间件调用链的函数next,如果你想让后面的中间件继续处理请求,就需要调用next方法。即当前中间件没有完成对网页的res响应 ,还可以通过next把router 留给下一个middleware继续执行

1.通过express应用的use(all),把Middleware同router路径上的所有HTTP方法绑定

express的use()功能在api中的定义是app.use([path],function),

不指定path的情况下,对应的是默认的'/',

当指定path时,会对匹配的url进行处理

 

路由Router对象:

express实例的路由越来越多的时候,最好把路由分类独立出去,express的实例(app) 能更好的处理其他逻辑流程。Express的Router对象是一个简化的 app实例,只具有路由相关的功能,包括use, http verbs,get等等。最后这个Router再通过app的use挂载到app的相关路径下。你可以把Router直接传递给app.use,像使用中间件那样使用Router。另外你还可以使用router来处理针对GET、POST等的路由,也可以用它来添加中间件,总之你可以将Router看作一个微缩版的app。

var express = require('express');

//创建一个Router实例

var router = express.Router();

router.use(function(req, res, next) { 

    console.log('%s %s %s', req.method, req.url, req.path); 

    next();

 });

router.get('/select', function(req, res, next) {

    until.client.query('select * from t_user;', function (error, rows, fields) {

        if (error) {

            console.log("ClientReady Error:" + error.message);

            return;

        } else {

            res.render('mysql', { rows: rows });

        }

    })

});

定义了router后,也可以将其作为中间件传递给app.use:

app.use('/events', router);

app.get挂载‘/’的路由只响应跟'/'精确匹配的GET请求。 而app.use挂载的'/'的路由响应所有以'/' 为起始路由的路由,且不限制HTTP访问的方法。

 

路由模块

express工具创建的应用,有一个routes目录,下面保存了应用到网站的Router模块,index.js和user.js。这两个模块基本一样,我们研究一下index.js。

下面是index.js的内容:

var express = require('express');

var router = express.Router();

/* GET home page. */

router.get('/', function(req, res, next) {

  res.render('index', { title: 'Express' });

});

module.exports = router;

index.js创建了一个Router实例,然后调用router.get为“/”路径应用了路由函数。最后使用module.exports将Router对象导出。

下面是app.js里引用到index.js的代码:

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

...

app.use('/', routes);

第一处,require(‘./routes/index’)将其作为模块使用,这行代码导入了index.js,并且将index.js导出的router对象保存在变量routes里以供后续使用。注意,上面代码里的routes就是index.js里的router。

第二处代码,把routes作为一个中间件,挂载到了“/”路径上。

模块

前面分析index.js时看到了module.exports的用法。module.exports用来导出一个Node.js模块内的对象,调用者使用require加载模块时,就会获得导出的对象的实例。

我们的index.js导出了Router对象。app.js使用require(‘./routes/index’)获取了一个Router实例。

module.exports还有一个辅助用法,即直接使用exports来导出。

exports.signup = function(req, res){

  //some code}

 

exports.login = function(req, res){

  //some code

}

上面的代码(假定在users.js文件里)直接使用exports来导出。当使用exports来导出时,你设置给exports的属性和方法,实际上都是module.exports的。这个模块最终导出的是module.exports对象,你使用类似“exports.signup”这种形式设置的方法或属性,调用方在require后都可以直接使用。

使用users模块的代码可能是这样的:

var express = require('express');var app = express();

...var users = require('./routes/users');

app.post('/signup', users.signup);

app.post('/login', users.login);

...

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值