Express是一个轻量级的Web框架,简单、灵活
也是目前最流行的基于Nodejs的Web框架
通过它我们可以快速搭建功能完整的网站 (express 英文意思:特快列车)
Express现在是4.x版本,更新很快,并且不兼容旧版本,导致现在市面上很多优秀的Node书籍过时
这篇文章是一篇入门级的Express使用,需要一定Node.js的基础
Web应用创建
首先要做的是下载express并引用
npm install express --save</div>
全局安装就+个-g
引用express
var express = require('express'); var app = express();</div>
通过app我们就可以使用各种express的API
在3.x版本的时候是这样写的
var app =express.createServer();</div>
现在这个函数已经被抛弃了
下面正式创建应用
//app.js var express = require('express'); var app = express(); app.get('/', function(req, res){ res.send('Express'); }); app.listen(3000);</div>
启动之后就能给够在页面看到效果
$ node app.js</div>
app.get()
上面的app.listen()就不多说了
用于监听端口
app.get(path, function(req, res){ })</div>
用于用于处理客户端向服务器发送的GET请求
path表示请求的路径
回调函数的req和res是request和response的意思
request表示客户端发送的HTTP请求信息
response表示服务器发送的HTTP响应信息
使用res.send()可以向客户端发送信息
//app.js var express = require('express'); var app = express(); app.get('/', function(req, res){ res.send('<h1>Express</h1>'); }); app.get('/demo', function(req, res){ res.send('<h1>Demo</h1>'); }) app.get('/*', function(req, res){ res.send('<h1>404<h1>'); }) app.listen(3000);</div>
app.post()
app.post(path, function(req, res){ })</div>
用于用于处理客户端向服务器发送的POST请求
和GET请求不同,POST请求不会将信息放在url中
而是写入请求头中
它的解析有所不同,下面再说
app.all()
在此之前还要提一个概念——中间件
Middleware中间件在不同环境下有不同含义
而在我们express中,简单说它就是一个特殊的函数
用来处理HTTP请求的函数
并且它有一个特点——处理完一个中间件可以传递给下一个中间件来处理
funciton(req, res, next){ ... next(); }</div>
(如果不使用执行next函数,那么之后监听的函数也不会执行)
可以向next中传递字符串参数,代表抛出的错误信息
这样当数据往下传递的时候,中间件不再进行处理
直到找到一个错误处理函数为止
在app.all(path, function(req, res, next){ })
的使用中
就需要我们定义这样的中间件
这个方法可以过滤所有路径上的请求
换句话说,在其他所有的中间件处理之前
必须先通过app.all()的中间件进行处理
var express = require('express'); var app = express(); app.all('*', function(req, res, next){ res.writeHead(200, ':)'); next(); }); app.get('/', function(req, res){ res.end('<h1>Express</h1>'); }); app.get('/demo', function(req, res){ res.end('<h1>Demo</h1>'); }) app.get('/*', function(req, res){ res.end('<h1>404<h1>'); }) app.listen(3000);</div>
这样不论客户端向我们发出了什么样的路径请求
服务器响应信息前都会先打上响应头
app.use()
app.use([path, ]function(req, res, next){ })</div>
这个方法一般情况是用来调用中间件的
与前面的函数不同,它的第一个path参数可以省略,默认'/'
app.use(express.static(path.join(__dirname, '/public')));</div>
上面的这个用法就是指定静态文件的访问路径
通过next参数我们可以连续调用中间件函数
app.use(function(req, res, next){ console.log(1); next(); }); app.use(function(req, res, next){ console.log(2); next(); }); app.use(function(req, res, next){ console.log(3); }); app.use(function(req, res, next){ console.log(4); });</div>
当发出网络请求的时候
控制台就会输出 1 2 3
因为第三个中间件没有调用next方法
所以处理到此为止
不会输出4
app.use()除了调用中间件
还可以根据请求路径的不同,返回不同信息
但我们一般不会这么用
//app.js var express = require('express'); var app = express(); app.use(function(req, res, next){ if(req.url == '/'){ res.end('<h1>Express</h1>'); }else{ next(); } }); app.use(function(req, res, next){ if(req.url == '/demo'){ res.end('<h1>Demo</h1>'); }else{ next(); } }); app.use(function(req, res, next){ res.end('<h1>404<h1>'); }); app.listen(3000);</div>
请求与响应
上面express中每一个回调函数都不可缺少req和res参数
重要性可见一斑
常见的req与res中的属性/方法如下(原生node.js的req、res属性/方法也可以使用)
Request对象:
API | 含义 |
---|---|
req.app | 当callback为外部文件时,用于访问express的实例 |
req.baseUrl | 获取路由当前安装的URL路径 |
req.body/cookies | 获得「请求主体」/ Cookies |
req.fresh/stale | 判断请求是否还「新鲜」 |
req.hostname/ip | 获取主机名和IP地址 |
req.originalUrl | 获取原始请求URL |
req.params | 获取路由的parameters |
req.path | 获取请求路径 |
req.protocol | 获取协议类型 |
req.query | 获取URL的查询参数串 |
req.route | 获取当前匹配的路由 |
req.subdomains | 获取子域名 |
req.acceptsCharsets | 返回指定字符集的第一个可接受字符编码 |
req.acceptsEncodings | 返回指定字符集的第一个可接受字符编码 |
req.acceptsLanguages | 返回指定字符集的第一个可接受字符编码 |