express学习 (3)
express 路由
1. 路由
1.1 路由的基本概念
路由是指确定应用程序如何响应客户端对特定端点的请求,这个端点是URI(或路径)和特定的HTTP请求方法(GET、POST等)。每个路由可以有一个或多个处理函数,当路由匹配时执行这些函数。
1.2 统一资源定位系统(uniform resource locator;URL)
URL
统一资源定位系统(uniform resource locator;URL)是因特网的万维网服务程序上用于指定信息位置的表示方法。其格式一般满足如下规则:
//<用户名>:<密码>@<主机>:<端口>/<url路径>
URL有很多不同的子类型,如Gopher URL
、FTP URL
、mailto URL
、WAIS URL
、File URL
、HTTP URL
、Prospero URL
等。
HTTP URL
HTTP URL 方案是用来标志因特网上使用HTTP(HyperText Transfer Protocol,超文本传输协议)的可达资源。HTTP协议在其他的地方进行了详细说明。本文只介绍了HTTP URL的语法。HTTP URL的形式如下:
http://<host>:<port>/<path>?<searchpart>
<path>
是一个HTTP选择器,<searchpart>
是查询字符串。<path>
,<searchpart>
和它前面的“?”都是可选择的。如果<path>
和<searchpart>
部分都没有,则“/”也可以省略。<path>
和<searchpart>
部分中的“/”,“;”和 “?”都是保留字符。“/”字符可以在HTTP中用来表示层次结构。
在互联网Web项目中,我们一般通过 HTTP/HTTPS 进行通信,这就需要使用 HTTP URL 来定位所请求资源的位置。在服务器端我们使用“路由”的实质也就是在位不同的资源(包含信息等)设定一个具体的URL路径。
2. HTTP请求
2.1 HTTP请求的类型
HTTP 请求可以使用多种请求方法
编号 | 请求方式 | 说明 |
1 | GET |
请求指定的页面信息,并返回实体主体。 |
2 | HEAD |
类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST |
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT |
从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE |
请求服务器删除指定的页面。 |
6 | CONNECT |
HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS |
允许客户端查看服务器的性能。 |
8 | TRACE |
回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH |
是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
2.2 HTTP请求的状态码
2.2.1 HTTP状态码的分类
HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型,各种类型及其含义如下:
分类 | 分类描述 |
1XX |
信息,服务器收到请求,需要请求者继续执行操作 |
2XX |
成功,操作被成功接收并处理 |
3XX |
重定向,需要进一步的操作以完成请求 |
4XX |
客户端错误,请求包含语法错误或无法完成请求 |
5XX |
服务器内部错误,服务器在处理请求的过程中发生了错误 |
2.2.2 所有HTTP状态码
HTTP状态码表:
状态码 | 状态码英文名称 | 中文描述 |
1XX | 消息 | --------------------------------------------------------------------------------------------------------------- |
100 |
Continue | 继续。客户端应继续其请求 |
101 |
Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
2XX | 成功 | --------------------------------------------------------------------------------------------------------------- |
200 |
OK | 请求成功。一般用于GET与POST请求 |
201 |
Created | 已创建。成功请求并创建了新的资源 |
202 |
Accepted | 已接受。已经接受请求,但未处理完成 |
203 |
Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 |
No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 |
Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 |
Partial Content | 部分内容。服务器成功处理了部分GET请求 |
3XX | 重定向 | --------------------------------------------------------------------------------------------------------------- |
300 |
Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 |
Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 |
Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 |
See Other | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 |
Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 |
Use Proxy | 使用代理。所请求的资源必须通过代理访问 |
306 |
Unused | 已经被废弃的HTTP状态码 |
307 |
Temporary Redirect | 临时重定向。与302类似。使用GET请求重定向 |
4XX | 请求错误 | --------------------------------------------------------------------------------------------------------------- |
400 |
Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 |
Unauthorized | 请求要求用户的身份认证 |
402 |
Payment Required | 保留,将来使用 |
403 |
Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 |
Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
405 |
Method Not Allowed | 客户端请求中的方法被禁止 |
406 |
Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
407 |
Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 |
Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 |
Conflict | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
410 |
Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 |
Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 |
Precondition Failed | 客户端请求信息的先决条件错误 |
413 |
Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 |
Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 |
Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 |
Requested range not satisfiable | 客户端请求的范围无效 |
417 |
Expectation Failed | 服务器无法满足Expect的请求头信息 |
5XX | 服务器错误 | --------------------------------------------------------------------------------------------------------------- |
500 |
Internal Server Error | 服务器内部错误,无法完成请求 |
501 |
Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 |
Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 |
Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 |
Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 |
HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
3. express中路由的定义方法
3.1 路由的匹配
3.1.1 定义完整的express路由
这是最简单、朴素的定义方式,也就是将路由完整地写完。只有在路由及其简单的时候我们才会采取这样的方式,例如一般情况下路由为主页时,我们定义主页的路由为"/"
。
3.1.2 定义包含模糊匹配的express路由
express支持使用?
、+
、()
、*
等等符号进行模糊匹配。例如:
"/ab?c"
可以匹配/ac
和/abc
,?
号表示前一个字符既可以有也可以没有;"/a(bc)?d"
可以匹配/ad
和/abcd
,一对小括号()
用于将一部分字符串视为一个整体;"/ab+c"
可以匹配/abc
、/abbc
、/abbbc
…,+
号表示有任意多个前一个字符;"/ab*c"
可以匹配/ab91wd
等,通配符*
可以表示匹配任意的字符或者字符串;
3.1.3 在express路由中使用正则表达式
express路由中是支持直接使用正则表达式的,比如/abc/
能够匹配路径中包含abc
字符串的任何内容,如/abc
、aabc
、abcd
等等。
【实例】正则匹配字符串/abc
和 /xyz
:
app.use(/\/abc|\/xyz/, function (req, res, next) { next() })
3.1.4 使用数组来同时定义多个路由规则
【实例】使用数组来匹配多个规则:
app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) { next() })
3.2 基于不同HTTP请求的路由
var express = require('express'); // 引入express var router = express.Router(); // 引入express路由对象
3.2.1 GET请求
【例如】:
router.get('/'), function(req, res, next){ res.render('index', {title:'Express'}) }
3.2.2 POST请求
【例如】:
router.post('/testpost'), function(req, res, next){ res.render('index', {msg:'some info'}) // 渲染`index`视图 }
3.2.3 DELETE请求
【例如】:
router.delete('/'), function(req, res, next){ res.render('index', {msg:'some info'}) // 渲染`index`视图 }
3.2.4 PUT请求
【例如】:
router.put('/testput'), function(req, res, next){ res.render('index', {msg:'some info'}) // 渲染`index`视图 }
4. 请求对象与返回对象
4.1 请求对象Request
req对象表示 HTTP 请求并具有请求查询字符串、参数、正文、HTTP 标头等的属性。在本文档中,按照惯例,对象始终被称为req(并且 HTTP 响应是res),但其实际名称由您正在使用的回调函数的参数确定。
属性 | 含义 | 解释 |
Request.url |
获取请求地址 | |
Request.query |
获取GET请求参数 | |
Request.body |
获取POST请求参数 | |
Request.params |
获取URL中的自定义参数 | |
Request.headers |
获取请求头数据 | |
Request.cookies |
获取客户端cookie |
4.2 返回对象Response
res对象表示 Express 应用在收到 HTTP 请求时发送的 HTTP 响应。
方法 | 描述 | 说明 |
Response.render() |
渲染页面 | 他有3个参数, · view (必须),是一个字符串,表示用于渲染的文件名(相对路径);· local (可选),是一个对象,为属性定义页面的局部变量;· callback (可选),是一个函数,为回调函数。返回可能的错误和呈现的字符串,但不执行自动响应。发生错误时,该方法在next(err) 内部调用。 |
Response.send() |
发送HTTP响应 | 该方法发送一个HTTP响应给请求端,可以接收一个参数,并且该参数可以是任何类型。比如一个Buffer对象、一个字符串、一个对象,或者一个数组。如res.send(new Buffer('hellow')); ,再如res.send('some string') ,又如res.send({key:'value'}) |
Response.json() |
返回JSON格式的字符串数据 | 例如res.json({name:'JACK'}) ,我们传入的是一个js对象,但通过json() 方法,它将自动地被转换为一个JSON格式的字符串通过HTTP发送给请求方。 |
Response.status() |
设定HTTP状态码 | 如res.status(403).end() ,这时在Postman中可以看到返回的状态码时403。 |
Response.redirect() |
跳转指定的路由 | 如res.redirect('/home') 。 |
附1. express中间件(Middleware)
中间件并不是单独属于路由这一部分的概念,但是我们在此处已经用到了express为我们提供的一些中间件,因此有必要提前介绍一些中间件的概念。从功能上看,中间件是一些处理方法的合集,express也就是一个路由和各种中间件合成的Web框架。
由express官方团队维护的中间件
中间件模块 | 描述 | 替代内置功能 (Express 3) | 安装方式 | 引入模块 |
body-parser | 解析HTTP请求正文。 | express.bodyParser | npm install body-parser |
var bodyParser = require('body-parser') |
compression | 压缩HTTP响应。 | express.compress | npm install compression |
var compression = require('compression') |
connect-rid | 生成唯一的请求标识ID。 | NA | npm install connect-rid |
var rid = require('connect-rid'); |
cookie-parser | 解析cookie头并填充req.cookies 。 |
express.cookieParser | npm install cookie-parser |
var cookieParser = require('cookie-parser') |
cookie-session | 建立基于cookie的会话。 | express.cookieSession | npm install cookie-session |
var cookieSession = require('cookie-session') |
cors | 通过各种选项实现跨来源资源共享(CORS)。 | NA | npm install cors |
var cors = require('cors') |
csurf | CSRF防护。 | express.csrf | npm install csurf |
var csurf = require('csurf') |
errorhandler | 开发错误处理/调试。 | express.errorHandler | npm install errorhandler |
var errorhandler = require('errorhandler') |
method-override | 使用header重写HTTP方法。 | express.methodOverride | npm install method-override |
var methodOverride = require('method-override') |
morgan | HTTP 请求 日志器. | express.logger | npm install morgan |
var morgan = require('morgan') |
multer | 处理多部分表单数据。 | express.bodyParser | npm install --save multer |
var multer = require('multer') |
response-time | 记录HTTP响应时间。 | express.responseTime | npm install response-time |
var responseTime = require('response-time') |
serve-favicon | 提供图标。 | express.favicon | npm install serve-favicon |
npm install serve-favicon |
serve-index | 为给定路径提供目录列表。 | express.directory | npm install serve-index |
var serveIndex = require('serve-index') |
serve-static | 提供静态文件。 | express.static | npm install serve-static |
var serveStatic = require('serve-static') |
session | 建立基于服务器的会话(仅限开发)。 | express.session | npm install express-session |
var session = require('express-session') |
timeout | 为HTTP请求处理设置超时期限。 | express.timeout | npm install connect-timeout |
var timeout = require('connect-timeout') |
vhost | 创建虚拟域(domains)。 | express.vhost | npm install vhost |
var vhost = require('vhost') |
附2. 路由接口测试(Postman简易教程)
F2.1 Postman简介
Postman 是一个接口测试软件,可以发送几乎所有类型的HTTP请求并适用于不同的操作系统。Postman 本地应用程序按照使用的系统分,其版本包括 Mac、Windows X32、Windows X64、Linux系统上的版本。Postman 还支持浏览器扩展程序、postman chrome应用程序等。更多有关信息可以访问Postman的主页https://www.postman.com/获取。
F2.2 Postman的下载和安装
postman的下载页面为:https://www.postman.com/downloads。
根据你的系统类型选择相应的选项进行下载即可。
下载完成后进行安装,这个过程十分简单,只需要不断地“下一步”即可,不做详细说明。安装好后,打开生成地Postman图标即可启动该软件:
打开软件后的主界面如图(请读者自行注册一个postman的账号):