一: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对象的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进行处理
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访问的方法。
下面是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导出了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);
...
我们输入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);
...
相关文章推荐
- Express---node.js-express框架中的主要方法,使用中间件关联 多个路由
- express 框架之 路由与中间件
- Artech的MVC4框架学习——第二章URL路由
- NodeJS-学习笔记(2)--使用node提供的express框架开发简单的web应用
- Node.js Express 框架学习
- Java学习笔记-----中间件,组件,容器,框架的精彩理解
- express 路由控制
- express 路由控制
- 学习ASP.NET MVC5框架揭秘笔记-ASP.NET路由(一)
- AngularJS学习(七)路由控制 ui-router
- AngularJS学习(六) 路由控制 ng-route
- Laravel 5框架学习之路由、控制器和视图简介
- nodejs express 框架解密3-中间件模块
- express3.4.8源码解析之路由中间件
- yii 学习笔记二 、路由 及 yii框架模版使用
- laravel框架学习-配置,路由
- 开源框架Spring学习之道:IoC控制反转(一)
- PHP再学习5——RESTFul框架 远程控制LED
- php Laravel框架学习(三) 之 路由
- 使用express+mongoDB搭建多人博客 学习(5)权限控制