您的位置:首页 > 其它

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

2016-10-20 16:23 441 查看
文章是根据网上的知识点,自己整合了一下。

我们输入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);

...

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: