写在前面
在这篇博客中,我为介绍express框架及其中间件的使用
何为express
express和原生nodejs的关系就类似于jquery和原生js的关系。
express基于nodejs,并对nodejs进行封装,更方便我们使用
使用express
第一步:引入express模块
const express=require('express');
第二步:开启服务
var server=express();
第三步:监听端口
server.listen(8080);
get&post&use
express对nodejs的http.createServer(function(req,res){})进行了封装。封装了三个函数:
server.get(function(req,res){})//接收get请求
server.post(function(req,res){})//接收post请求
server.use(function(req,res){})//接收所有请求
req&res
express是基于nodejs并高于nodejs的
基于nodejs:express的req和res保留了原有的属性和方法。
高于nodejs:express的req和res扩展了一些属性和方法。
举个例子
res.write(data)方法是先前台传送数据data,但是这个data不能是json。
express保留了res.write()方法,同时开发了res.send()方法。
res.send(data)方法是先前台传送数据data,这个data可以是任意数据。
这样的例子还有很多......
中间件
我们知道jquery是轻量级的框架,但是它却能做几乎所有的事情,原因是因为jquery支持插件,这使得有很多基于jquery的插件。
输入框插件,进度条插件等等......
类似jquery的express,类似jquery,它也支持中间件。这里我们介绍一个中间件:
body-parser
const bodyParser=require('body-parser');
server.use(bodyParser.urlencoded({
extended: false, //扩展模式
limit: 2*1024*1024 //限制-2M
}));
server.use('/', function (req, res){
console.log(req.body); //POST
});
它的简单作用是将post请求的数据存入req.body中
自定义中间件
类似于自定义模块,我简单写一个自定义的body-parser,实现将post请求的数据存入req.body的功能。
const querystring=require('querystring');
module.exports={
urlencoded: function (){
return function (req, res, next){
var str='';
req.on('data', function (data){
str+=data;
});
req.on('end', function (){
req.body=querystring.parse(str);
next();
});
};
}
}
这同样也能实现同样的功能,也许有人会奇怪我写的函数里next();是什么意思,这就是express的链式操作了
链式操作
什么是链式操作?链式操作类似于生活中的流水线。张三做了机顶盒,李四再来上漆,王五最后包装。next()的作用就是传给下一个人。
以post请求为例
server.use(function (req, res, next){
var str='';
req.on('data', function (data){
str+=data;
});
req.on('end', function (){
req.body=querystring.parse(str);
next();//李四:req.body已经准备好
});
});
server.use('/', function (req, res){
console.log(req.body); //王五:打印李四准备好的req.body
});