Node.js_3.Express

1 Express

1.1 Express概述

1.1.1 概述

Node.js原生提供的http模块创建基于HTTP协议的Web服务器端应用,提供的API不够简单易用
解析请求消息麻烦;发送响应消息的方法单一;缺少Cookie和Session处理的直接API

Express是基于Node.js HTTP模板的极简、灵活的Web应用开发框架;
丰富的HTTP快捷方法和任意排列组合的中间件能快速简单的创建API;
Express在Node.js不对已有特性进行二次抽象,只扩展Web应用所需基本功能;
官网:http://expressjs.com/
中文网:http://www.expressjs.com.cn/

1.1.2 下载和安装

npm init
npm install express --save

1.1.3 最简Web服务器

Express框架可以方便的创建基于HTTP协议的Web服务器
1.基于http,将Express作为请求处理函数(Express3.0系列创建HTTP服务器方式)

const http = require('http');
const express = require('express');
var app = express();//创建Express应用程序
http.createServer(app).listen(80);
//定义中间件和路由

2.直接将Express作为服务器使用

const express=require('express');
var server=express();
server.listen(3000);

//增加中间变量
const express = require('express');
var app = express();//创建Express应用程序
var server = app.listen(80, ()=>{
	console.log(server.address().address, server.address().port);
});
//定义Express中间件和路由

浏览器向服务器端传递数据的方式:
1)get->req.query
2)post->req.body
3)路由传参->req.params

1.2 路由

1.2.1 路由定义

Express路由:HTTP客户端发来请求消息,服务器端程序根据请求方法请求URI确定响应方法
三部分组成:app.METHOD(PATH, HANDLER)
路由方法:对应于某个HTTP请求方法,get、post、put、delete;直接输入地址栏默认使用get方法
路由路径:定义请求的目标;
路由句柄(回调函数):请求处理函数,参数是请求对象和响应消息对象;

1.2.2 请求对象

Express处理请求消息的异步回调函数中,第一个形参是请求消息的描述对象,可以从中读取请求消息中的数据

app.get('/', (req, res)=>{
	req.method//请求方法
	req.url//请求URL
	req.headers//请求头部
	req.body//请求主体
	req.query//查询字符串数据对象,仅限于获取url中查询字符串,所以不能在post方法里使用
	req.params//路由参数对象
});
1.2.3 响应对象

Express处理请求消息的异步回调函数中,第二个形参用于设置向客户端输出的相应数据

app.get('/', (req, res)=>{
	res.status(200)//设置响应状态码
	res.type('json')//修改Content-Type响应头
	res.set(header, value)//设置消息响应头
	res.send('response body')//响应文本,只能响应一次;如果是数字认为是状态码。
	res.sendFile('path/of/file')//响应文件,必须使用绝对路径(__dirname) 
	res.json(obj)//发送JSON响应,将对象转换成json格式
	res.redirect('path')//响应重定向
	res.end()//响应结束,结束以后才会将响应对象发送给浏览器
});
1.2.4 处理GET请求

HTTP协议规定,GET请求表示客户端请求指定资源,使用express路由方法中的get()方法处理客户端提交的GET请求

app.get('/', (req,res)=>{req.query})//获取查询字符串数据
app.get('/user/:uid', (req, res)=>{req.params});
1.2.5 处理POST请求

HTTP协议规定,POST请求表示客户端提交并保存数据到服务器,使用express路由方法中的post()方法处理客户端提交的POST请求
不能使用req.query获取post请求的数据,应该以事件的形式获取表单数据,因为post请求url只包含路径以前的信息
将内存中数据转为字符串后,还需要引入querystring模块才能转为obj对象,使用其中数据

   app.post('/user', (req,res)=>{
    	  req.on('data', (data)=>{
    	  	var body = querystring.parse(data.toString());
    	  });
    });
1.2.6 处理所有请求(不使用)

Express路由方法中的all()方法用于处理客户端提交的GET、POST、PUT、DELETE等任意类型的请求消息
app.all(’/user’, (req, res)=>{req.query});

1.2.7 路由传参

客户端向服务器请求数据时,可使用传统的查询字符串方式,express允许在请求URI中包含请求参数。
在路由中设置了多个参数的话,要求浏览器端也要输入同样多的参数才能访问该路由

//:uid?表示用uid来接收浏览器传递的数据
//req.params用来获取路由传递的数据,格式为对象
app.get('/user/:uid?/:pno?', (req, res)=>{
	req.params.uid
	req.params.pno
});
1.2.8 路由路径

使用带有模式字符串的路由路径——?+*()

//匹配acd和abcd
app.get('/ab?cd', (req, res)=>{res.send(req.url); });
//匹配abcd和abbcd、abbbcd...
app.get('/ab+cd', (req, res)=>{res.send(req.url); });
//匹配abcd和abxcd、abSTHcd、ab123cd
app.get('/ab*cd', (req, res)=>{res.send(req.url); });
//匹配abe和abcde
app.get('/ab(cd)?e', (req, res)=>{res.send(req.url); });

使用正则表达式的路由路径:

//匹配任何路径中含有user的路径
app.get(/user/, (req, res)=>{res.send(req.url); });
//匹配showuser、deluser等,不匹配showusers等
app.get(/.*user$/, (req, res)=>{res.send(req.url); });

1.3 路由器

1.3.1 路由器定义

大型项目中每个功能点对应一个路由,这些路由如果全部声明在一个文件中不利于代码开发维护以及成员间的分工协作。
将不同路由根据模块逻辑划分到不同的文件中,并用路由器加以管理,路由器是一个js文件
express.Router:路由器是一种可同时挂载多个路由的对象,这些路由功能相关,有相同的路由地址前缀。

const express = rquire('express');
//创建空的路由器对象
const router = express.Router();
//添加路由
router.get('/', (req, res)=>{res.send('...');});
router.get('/detail', (req, res)=>{res.send('...');});
//导出路由器
module.exports= router;
1.3.2 挂载路由器

路由器模块编写完成后,可以在主模块中加载并使用

const product = require('./product');
//将路由器product挂载到/product目录下
app.use('/product', product);//为路由器分配挂载地址

如果多个路由器挂载在同一目录下,以先定义的路由为准

1.4 中间件

1.4.1 中间件定义

1.Express是一个自身功能极简,完全由路由和中间件构成的web开发框架,意味着Express应用的实质就是在调用各种中间件。
2.中间件Middleware是一个函数,用于访问请求对象和响应对象,也可以访问web应用中处于请求响应流程中的其他中间件。
3.中间件功能:执行代码;修改请求和响应对象;终结请求-响应过程;调用堆栈中下一个中间件;为主要的业务逻辑所服务。
4.请求消息->中间件1->中间件2->…->路由句柄

1.4.2 中间件分类

分为5个:应用级中间件、路由级中间件、内置中间件、第三方中间件、错误级中间件
1)应用级中间件
每一个中间件就是一个函数,需要配合其他中间件或者路由使用;
中间件往后执行需要调用next()方法

//创建中间件——拦截浏览器请求,也可以做出响应
//不指定路径则拦截所有路由的请求
//指定路径则拦截特定路由server.use('', callback);
server.use((req, res, next)=>{
	console.log('验证是否为空');
	//res.send('验证失败');
	next();//继续调用下一个中间件或路由
});

app.use( [path], middlewareFn );
//path参数可选,指定中间件应用到的请求路径
//middlewareFn必需,指定执行的中间件函数

function bodyParser() {
	return function(req, res, next ) {
		req.on('data', (data)=>{
			req.body = querystring.parse(data.toString());
			next();
		});
	}
}
app.use(bodyParser());
app.post('/user', (req, res)=>{
	//从req.body中读取数据
});

2)路由级中间件
用于在服务器中将路由器挂载到特定的URL,即路由器

const router_user = require('./user');
server.use('/user', router_user);

3)内置中间件
Express 4.x剥离大多数中间件使之成为独立NPM包,仅保留一个express.static中间件用于向客户端输出指定目录静态资源文件(html、css、js、图片等);
浏览器请求这些静态资源文件,会自动到指定目录下查找。

var express = require('express');
var server = express();
server.use(express.static('要托管的目录'));

express.static中间件可以多次调用来访问多个静态资源保存目录。
如果浏览器访问的文件名在多个静态资源保存目录下都有,则选择最前面的express.static中间件

3)第三方中间件
www.expressjs.com.cn/resources/middleware.html
常用第三方中间件:
body-parser:请求主体数据解析中间件
cookie-parser:Cookie数据解析中间件
cookie-session:基于Cookie的Session处理中间件
compression:响应消息压缩中间件

使用过程:
1)下载安装中间件模块:
npm install body-parser
2)引入并调用中间件模块:

//方法用于将post请求数据解析为对象
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({
//extended表示是否使用扩展的qs模块将查询字符串解析为对象
extended:false //可以使用核心模块querystring
}));

server.post('/', (req,res)=>{
	//bodyParser中间件为req添加了body成员
	console.log(req.body);//req.body返回数据的对象格式
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值