AJAX学习笔记
前言
主要记录从XMLHttpRequest
、Promise
到axios
的技术转变,也包括回调函数地狱问题和解决方法。
本篇文章会利用node.js快速搭建一个express服务器,用于编写样例所需要的API接口,方便测试及展示。
安装express的命令:
npm install express --save
XMLHttpRequest
介绍XMLHttpRequest(XHR)之前首先简单介绍一下AJAX是什么:
AJAX是“Asynchronous JavaScript And XML” 的缩写,即“异步的JavaScript和XML”。是一种实现无页面刷新获取服务器数据的技术。
XML是可扩展标记语言,是一种特征类似HTML,用于标记电子文件使其具有结构性的标记语言,它是用来承载数据的。
而目前使用最多的JSON,它是仅仅一种数据格式,在JSON没有成为主流传输数据格式之前,人们大量使用XML作为数据传输的载体。
AJAX技术的核心就是XHR:
**XMLHttpRequest(XHR)**对象用于与服务器交互。通过XMLHttpRequest可以在不刷新页面的情况下请求特定的URL并获取数据。这允许网页在不影响用户操作的情况下更新页面的局部内容。
基本使用
XHR的使用语法如下:
1 | <script> |
另外有种写法如下:
1
2
3
4
5
6
7
8
9
10
11 <script>
const xhr = new XMLHttpRequest()
xhr.open('请求方式(大小写均可)', '请求url地址')
// 利用XHR对象的onreadystatechange属性(通常为匿名函数)监听XHR对象的状态改变
xhr.onreadystatechange = function() {
if((xhr.readyState==4) && (xhr.status==200)){
console.log(xhr.responseText)
}
}
xhr.send()
</script>(出于简洁,使用第一种方式:直接利用
addEventListener
绑定监听事件,一旦监听到Loaded状态(即「请求/响应」动作完成),就直接响应结果。)
XHR对象继承的部分属性如下:
-
response
/responseText
:包含响应主体返回的文本。response
:该属性可以获取任意格式的响应数据,包括文本、JSON、XML等。(例:当设置了responseType
为json
时,可以直接通过response
属性获取解析好的JSON对象,而不需要手动解析)responseText
:该属性用于获取文本格式的响应数据。 -
readyState
:表示在「请求/响应」过程中当前的活动阶段。(这个属性的值从 0 开始,直到接收到完整的 HTTP 响应,该值增加到 4)状态 名称 描述 0 Uninitialized 初始化状态。XHR对象已创建或已被 abort()
方法重置。1 Open open()
方法已调用,但是send()
方法未调用。请求还没有被发送。2 Sent send()
方法已调用,HTTP请求已发送到Web服务器。未接收到响应。3 Receiving 所有响应头部都已经接收到。响应体开始接收但未完成。 4 Loaded HTTP响应已经完全接收。 readyState的值不会递减,除非当一个请求在处理过程中的时候调用了
abort()
或open()
方法,每次这个属性的值增加的时候,都会触发onreadystatechange
事件句柄。 -
status
:响应的HTTP状态(2xx - 5xx) -
statusText
:HTTP 服务器返回的响应状态,与status不同的是,它包含完整的响应状态文本(例如,“200 OK
”)
XHR对象继承的方法如下:
open()
:用于准备启动一个AJAX请求setRequestHeader()
:用于设置请求头部信息send()
:用于发送AJAX请求abort()
:用于取消异步请求
使用案例
发送GET请求:
1 |
|
服务端代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 let express = require('express')
let app = express()
app.all('*', function (req, res, next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header('Access-Control-Allow-Origin', '*')
//允许的header类型
res.header('Access-Control-Allow-Headers', 'content-type')
//跨域允许的请求方式
res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS')
if (req.method.toLowerCase() == 'options') res.send(200)
//让options尝试请求快速结束
else next()
})
app.get('/', (req, res) => {
res.json({
msg: '收到get请求',
})
})
app.listen(11000, () => {
console.log('http://localhost:11000')
})服务端输出结果:
1 http://localhost:11000
携带参数
GET请求
需要手动将参数编写到访问的url中。
案例:GET请求携带两个参数,分别为name
和age
:
1 |
|
可以通过创建
URLSearchParams
对象并调用toString()
方法得到查询参数字符串(格式:参数名1=值1&参数名2=值2&...
),再通过字符串模板的写法将查询参数串添加到url中。也可以直接手动添加参数到url中:
http://localhost:11000?name=花猪&age=18
服务端代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 let express = require('express')
let app = express()
app.all('*', function (req, res, next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header('Access-Control-Allow-Origin', '*')
//允许的header类型
res.header('Access-Control-Allow-Headers', 'content-type')
//跨域允许的请求方式
res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS')
if (req.method.toLowerCase() == 'options') res.send(200)
//让options尝试请求快速结束
else next()
})
app.get('/', (req, res) => {
const queryParams = req.query;
const name = req.query.name;
const age = req.query.age;
res.json({
msg: `收到get请求,其中 name = ${name},age = ${age}`,
})
console.log(`name = ${name}`)
console.log(`age = ${age}`)
})
app.listen(11000, () => {
console.log('http://localhost:11000')
})服务端输出结果:
1
2
3 http://localhost:11000
name = 花猪
age = 18
POST请求
案例:POST请求携带两个参数,分别为username
和password
:
1 |
|
首先利用
setRequestHeader()
设置请求头内容,告知服务器传递的内容为JSON字符串,接下来就利用send()
方法将构建好的参数(JSON字符串)发送至服务器。
服务端代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 let express = require('express')
let bodyParser = require('body-parser'); // 1.引入body-parser
let app = express()
app.all('*', function (req, res, next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header('Access-Control-Allow-Origin', '*')
//允许的header类型
res.header('Access-Control-Allow-Headers', 'content-type')
//跨域允许的请求方式
res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS')
if (req.method.toLowerCase() == 'options') res.send(200)
//让options尝试请求快速结束
else next()
})
// 2.使用body-parser中间件解析JSON类型的请求体
app.use(bodyParser.json());
app.post('/', (req, res) => {
// 3.通过req.body访问POST请求的参数
const postData = req.body;
res.json({
msg: `收到post请求,其中 username = ${postData.username},password = ${postData.password}`,
})
console.log(`username = ${postData.username}`)
console.log(`password = ${postData.password}`)
})
app.listen(11000, () => {
console.log('http://localhost:11000')
})注:express要想接收POST请求参数,可以使用内置的
body-parser
中间件来解析POST请求的参数,首先需要安装:
npm install body-parser --save
1
2
3
4
5
6 // 1.引入body-parser
let bodyParser = require('body-parser');
// 2.使用body-parser中间件解析JSON类型的请求体
app.use(bodyParser.json());
// 3.通过req.body访问POST请求的参数
const postData = req.body;服务端输出结果:
1
2
3 http://localhost:11000
username = HuaZhu
password = 123456
Promise
Promise
对象用于表示(管理)一个异步操作的最终状态(成功或失败)及其结果值。
优势:
- 使处理异步操作的逻辑更清晰(处理成功或失败会关联后续的处理函数)
- 可以解决回调函数地狱问题
基本使用
Promise的使用语法如下:
1 | <script> |
Promise的三种状态
一个Promise对象必然处于以下三种状态之一:
- pending(待定):初始状态,既没有被兑现,也没有被拒绝。(一旦Promise对象被创建就进入此状态)
- fulfilled(已兑现):操作成功完成。如果操作成功,就会触发
resolve()
函数,接着触发调用then()
函数。 - rejected(已拒绝):操作失败。如果操作失败,就会触发
reject()
函数,接着触发调用catch()
函数。
使用示例
结合promise和XHR实现异步GET请求访问:
1 |
|
-
访问:
http://localhost:11000
响应成功: -
访问
http://localhost:11001
响应失败:
服务端代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 let express = require('express')
let app = express()
app.all('*', function (req, res, next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header('Access-Control-Allow-Origin', '*')
//允许的header类型
res.header('Access-Control-Allow-Headers', 'content-type')
//跨域允许的请求方式
res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS')
if (req.method.toLowerCase() == 'options') res.send(200)
//让options尝试请求快速结束
else next()
})
app.get('/', (req, res) => {
res.json({
msg: '收到get请求',
})
})
app.listen(11000, () => {
console.log('http://localhost:11000')
})
封装Promise和XHR实现异步请求
为了更好的复用Promise+XHR实现异步请求,我们可以将其封装为一个函数(myAxios),如果有异步请求需要就去调用该函数,其整体结构如下:
1 | <script> |
使用案例
服务端代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 let express = require('express')
const bodyParser = require('body-parser');
let app = express()
app.all('*', function (req, res, next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header('Access-Control-Allow-Origin', '*')
//允许的header类型
res.header('Access-Control-Allow-Headers', 'content-type')
//跨域允许的请求方式
res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS')
if (req.method.toLowerCase() == 'options') res.send(200)
//让options尝试请求快速结束
else next()
})
// 处理GET请求
app.get('/', (req, res) => {
const queryParams = req.query;
const name = req.query.name;
const age = req.query.age;
res.json({
msg: `收到get请求,其中 name = ${name},age = ${age}`,
})
console.log(`name = ${name}`)
console.log(`age = ${age}`)
})
// 使用body-parser中间件解析JSON类型的请求体
app.use(bodyParser.json());
// 处理POST请求
app.post('/', (req, res) => {
// 通过req.body访问POST请求的参数
const postData = req.body;
res.json({
msg: `收到post请求,其中 username = ${postData.username},password = ${postData.password}`,
})
console.log(`username = ${postData.username}`)
console.log(`password = ${postData.password}`)
})
app.listen(11000, () => {
console.log('http://localhost:11000')
})
GET请求
GET请求携带两个参数,分别为name
和age
:
1 |
|
-
访问:
http://localhost:11000
响应成功:服务端输出结果:
1
2
3http://localhost:11000
name = 花猪
age = 18 -
访问:
http://localhost:11001
响应失败:
POST请求
POST请求携带两个参数,分别为username
和password
:
1 |
|
-
访问:
http://localhost:11000
响应成功:服务端输出结果:
1
2
3http://localhost:11000
username = HuaZhu
password = 123456 -
访问:
http://localhost:11001
响应失败:
异步代码
关于异步代码:
- 异步代码调用后耗时,不阻塞代码继续执行(不必原地等待),在将来完成后触发一个回调函数用来接收结果。
- JavaScript中的异步代码:
setTimeout()
/setInterval()
,事件,AJAX
本小节的案例是依次发出以下请求:请求到四川省、成都市、武侯区的信息。
- 访问
http://localhost:11000/province
请求全国省份列表数据,并拿到四川省信息- 携带参数“四川省”访问
http://localhost:11000/city
请求四川省城市列表数据,并拿到成都市信息- 携带参数“成都市”访问
http://localhost:11000/area
请求成都市地区县列表数据,并拿到武侯区信息本小节服务端代码如下,只是针对案例做了简单的数据返回:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 let express = require('express')
let app = express()
app.all('*', function (req, res, next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header('Access-Control-Allow-Origin', '*')
//允许的header类型
res.header('Access-Control-Allow-Headers', 'content-type')
//跨域允许的请求方式
res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS')
if (req.method.toLowerCase() == 'options') res.send(200)
//让options尝试请求快速结束
else next()
})
// 定义全国省份列表数据
const province = {
message: '获取省份成功',
list: ["北京","天津","河北省","山西省","内蒙古自治区","辽宁省","吉林省","黑龙江省","上海","江苏省","浙江省","安徽省","福建省","江西省","山东省","河南省","湖北省","湖南省","广东省","广西壮族自治区","海南省","重庆","四川省","贵州省","云南省","西藏自治区","陕西省","甘肃省","青海省","宁夏回族自治区","新疆维吾尔自治区","台湾","香港特别行政区","澳门特别行政区"]
}
// 定义四川省城市列表数据
const city = {
message: '获取城市成功',
list: ["成都市","自贡市","攀枝花市","泸州市","德阳市","绵阳市","广元市","遂宁市","内江市","乐山市","南充市","眉山市","宜宾市","广安市","达州市","雅安市","巴中市","资阳市","阿坝藏族羌族自治州","甘孜藏族自治州","凉山彝族自治州"]
}
// 定义成都市地区县列表数据
const area = {
message: '获取地区县成功',
list: ["锦江区","青羊区","金牛区","武侯区","成华区","龙泉驿区","青白江区","新都区","温江区","金堂县","双流县","郫县","大邑县","蒲江县","新津县","都江堰市","彭州市","邛崃市","崇州市"]
}
// GET请求(无参),返回全国省份列表数据
app.get('/province', (req, res) => {
res.json({
message: province.message,
list: province.list
})
console.log(province.message)
console.log(province.list)
})
// GET请求(含参)
// 如果没传参数或参数不为'四川省',则返回错误信息
// 如果参数为'四川省',返回四川省城市列表数据
app.get('/city', (req, res) => {
if(req.query === undefined || req.query.province != '四川省') {
res.status(400).send('参数错误')
console.log('获取城市失败')
} else {
res.json({
message: city.message,
list: city.list
})
console.log(city.message)
console.log(city.list)
}
})
// GET请求(含参)
// 如果没传参数或参数不为'成都市',则返回错误信息
// 如果参数为'成都市',返回成都市地区县列表数据
app.get('/area', (req, res) => {
if(req.query === undefined || req.query.city != '成都市') {
res.status(400).send('参数错误')
console.log('获取地区县失败')
} else {
res.json({
message: area.message,
list: area.list
})
console.log(area.message)
console.log(area.list)
}
})
app.listen(11000, () => {
console.log('http://localhost:11000')
})
回调函数地狱
关于回调函数地狱:在回调函数中一直向下嵌套新的回调函数,会形成回调函数地狱,会存在如:可读性差、异常捕获困难、高耦合的问题。
如下例所示,依次请求到四川省、成都市、武侯区的信息:
1 |
|
访问成功,控制台输出以下信息:
这样遵循访问顺序而嵌套调用myAxios()
函数的代码耦合性太高,而且最关键的是没有办法正确捕获异常:
案例:假设在最外层链接一个catch()
函数用于捕获异常信息,在请求城市和地区县的信息时不携带参数:
1 |
|
控制台输出以下信息:
可以看到,控制台只是抛出了访问城市的myAxios()
函数内部的错误,而最外层的catch()
函数并没有成功捕获到错误信息。这就是回调函数地狱带来的问题,一旦在回调函数嵌套中的某个环节出现了问题,没有办法及时捕捉到问题究竟出现在哪里。
Promise的链式调用
Promise提供了链式调用的语法,通过链式调用可以解决回调函数嵌套问题。语法特性如下:
then()
方法会返回一个新的Promise对象,利用此特性可以串联异步函数(非嵌套),直到结束then()
回调函数中的返回值会影响新生成的Promise对象最终状态和结果
可以按照图示思路重新实现依次请求到四川省、成都市、武侯区的信息:
1 |
|
访问成功,控制台输出以下信息:
一旦其中某一个访问出现错误,利用最后的catch()函数也可以捕获到错误信息,如此便可解决回调函数地狱问题:
1 |
|
控制台输出以下信息:
async 和 await 关键字
使用async
关键字修饰函数可以声明一个async函数,该函数是AsyncFunction
构造函数的实例,并且其中允许使用await
关键字。利用async
和await
关键字可以以一种更简洁的方式编写基于Promise的异步函数调用,而无需刻意的链式调用promise
。
使用案例
可以这样理解:在async函数内,使用await
关键字可以取代then()
函数,等待获取Promise对象成功状态的结果值。
案例:利用async
和await
关键字重新实现依次请求到四川省、成都市、武侯区的信息:
1 |
|
访问成功,控制台输出以下信息:
捕获错误
可以利用try
和catch
捕获同步流程的错误:
1 | try { |
案例:利用try
和catch
进行错误捕获:
1 |
|
控制台输出以下信息:
Promise.all() 静态方法
Promise.all()
静态方法允许将多个Promise对象合并为一个Promise对象。如果被合并的所有Promise对象都请求成功,则新合成的Promise对象执行then()
中的回调函数,result
以列表的形式包含所有Promise对象的返回;如果被合并的所有Promise对象中有一个请求失败,则新合成的Promise对象执行catch()
中的回调函数,捕获第一个失败的Promise对象抛出的异常。
语法如下:
1 | const p = Promise.all([Promise对象, Promise对象, ...]) |
案例:利用Promise.all()
合并多个Promise对象,重新实现依次请求到四川省、成都市、武侯区的信息:
1 |
|
访问成功,控制台输出以下信息:
如果其中一个Promise对象请求发生错误,则catch()
会捕获这个错误:
1 |
|
控制台输出以下信息:
Axios
实际上,已经有名为axios第三方库封装好了XHR和Promise,可以快速实现异步请求。(同之前手动封装的myAxios()
一样,是异步请求的终极策略)
安装axios:
- node环境:
npm install axios --save
- 浏览器:
axios的使用语法如下,其返回也是Promise对象,同样可以使用链式编程:
1 | // 调用axios函数,并传入配置参数 |
GET请求
GET请求携带两个参数,分别为name
和age
:
1 |
|
访问成功,控制台输出以下信息:
服务端代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 let express = require('express')
let app = express()
app.all('*', function (req, res, next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header('Access-Control-Allow-Origin', '*')
//允许的header类型
res.header('Access-Control-Allow-Headers', 'content-type')
//跨域允许的请求方式
res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS')
if (req.method.toLowerCase() == 'options') res.send(200)
//让options尝试请求快速结束
else next()
})
app.get('/', (req, res) => {
const queryParams = req.query;
const name = req.query.name;
const age = req.query.age;
res.json({
msg: `收到get请求,其中 name = ${name},age = ${age}`,
})
console.log(`name = ${name}`)
console.log(`age = ${age}`)
})
app.listen(11000, () => {
console.log('http://localhost:11000')
})服务端输出如下:
1
2
3 http://localhost:11000
name = 花猪
age = 18
POST请求
POST请求携带两个参数,分别为username
和password
:
1 |
|
访问成功,控制台输出以下信息:
服务端代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 let express = require('express')
const bodyParser = require('body-parser');
let app = express()
app.all('*', function (req, res, next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header('Access-Control-Allow-Origin', '*')
//允许的header类型
res.header('Access-Control-Allow-Headers', 'content-type')
//跨域允许的请求方式
res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS')
if (req.method.toLowerCase() == 'options') res.send(200)
//让options尝试请求快速结束
else next()
})
// 使用body-parser中间件解析JSON类型的请求体
app.use(bodyParser.json());
app.post('/', (req, res) => {
// 通过req.body访问POST请求的参数
const postData = req.body;
res.json({
msg: `收到post请求,其中 username = ${postData.username},password = ${postData.password}`,
})
console.log(`username = ${postData.username}`)
console.log(`password = ${postData.password}`)
})
app.listen(11000, () => {
console.log('http://localhost:11000')
})服务端输出如下:
1
2
3 http://localhost:11000
username = HuaZhu
password = 123456
链式调用
本小节的案例同样是依次发出以下请求:请求到四川省、成都市、武侯区的信息。
- 访问
http://localhost:11000/province
请求全国省份列表数据,并拿到四川省信息- 携带参数“四川省”访问
http://localhost:11000/city
请求四川省城市列表数据,并拿到成都市信息- 携带参数“成都市”访问
http://localhost:11000/area
请求成都市地区县列表数据,并拿到武侯区信息本小节服务端代码如下,只是针对案例做了简单的数据返回:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 let express = require('express')
let app = express()
app.all('*', function (req, res, next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header('Access-Control-Allow-Origin', '*')
//允许的header类型
res.header('Access-Control-Allow-Headers', 'content-type')
//跨域允许的请求方式
res.header('Access-Control-Allow-Methods', 'DELETE,PUT,POST,GET,OPTIONS')
if (req.method.toLowerCase() == 'options') res.send(200)
//让options尝试请求快速结束
else next()
})
// 定义全国省份列表数据
const province = {
message: '获取省份成功',
list: ["北京","天津","河北省","山西省","内蒙古自治区","辽宁省","吉林省","黑龙江省","上海","江苏省","浙江省","安徽省","福建省","江西省","山东省","河南省","湖北省","湖南省","广东省","广西壮族自治区","海南省","重庆","四川省","贵州省","云南省","西藏自治区","陕西省","甘肃省","青海省","宁夏回族自治区","新疆维吾尔自治区","台湾","香港特别行政区","澳门特别行政区"]
}
// 定义四川省城市列表数据
const city = {
message: '获取城市成功',
list: ["成都市","自贡市","攀枝花市","泸州市","德阳市","绵阳市","广元市","遂宁市","内江市","乐山市","南充市","眉山市","宜宾市","广安市","达州市","雅安市","巴中市","资阳市","阿坝藏族羌族自治州","甘孜藏族自治州","凉山彝族自治州"]
}
// 定义成都市地区县列表数据
const area = {
message: '获取地区县成功',
list: ["锦江区","青羊区","金牛区","武侯区","成华区","龙泉驿区","青白江区","新都区","温江区","金堂县","双流县","郫县","大邑县","蒲江县","新津县","都江堰市","彭州市","邛崃市","崇州市"]
}
// GET请求(无参),返回全国省份列表数据
app.get('/province', (req, res) => {
res.json({
message: province.message,
list: province.list
})
console.log(province.message)
console.log(province.list)
})
// GET请求(含参)
// 如果没传参数或参数不为'四川省',则返回错误信息
// 如果参数为'四川省',返回四川省城市列表数据
app.get('/city', (req, res) => {
if(req.query === undefined || req.query.province != '四川省') {
res.status(400).send('参数错误')
console.log('获取城市失败')
} else {
res.json({
message: city.message,
list: city.list
})
console.log(city.message)
console.log(city.list)
}
})
// GET请求(含参)
// 如果没传参数或参数不为'成都市',则返回错误信息
// 如果参数为'成都市',返回成都市地区县列表数据
app.get('/area', (req, res) => {
if(req.query === undefined || req.query.city != '成都市') {
res.status(400).send('参数错误')
console.log('获取地区县失败')
} else {
res.json({
message: area.message,
list: area.list
})
console.log(area.message)
console.log(area.list)
}
})
app.listen(11000, () => {
console.log('http://localhost:11000')
})
案例,使用axios依次请求到四川省、成都市、武侯区的信息:
(注意:返回的内容在result.data
中)
1 |
|
访问成功,控制台输出以下信息:
一旦其中某一个访问出现错误,利用最后的catch()函数可以捕获到错误信息:
1 |
|
控制台输出以下信息:
后记
此篇加深了对axios的理解。