1.js的执行机制
● js代码开始执行后,主线程执行栈中会把任务分为两类.
● 一类是同步任务, 一类是异步任务; 主线程执行栈优先执行同步任务,
● 异步任务会被放入特定的处理程序中,满足条件后,被放到消息(任务/事件)队列中
● 主线程执行栈中所有的同步任务执行完毕之后,通过事件循环去消息(任务/事件)队列中,
● 挑选优先满足条件的程序,放入主线程执行栈中执行。事件循环,周而复始,一直执行。
宏任务
微任务
微任务(microtask)是宏任务中的一个部分,它的执行时机是在同步代码执行之后,下一个宏任务执行之前。总结起来,微任务有:
Promise.then
process.nextTick(Node.js 环境)
运行机制总结:
JS优先执行同步任务,然后执行微任务,最后执行宏任务
网络通讯概述
网络通信三大要素: 协议,域名(IP),端口号
通过ip找到计算机,再通过端口找到应用程序,符合规则就可进行数据传输。
传输协议:规定数据传输的规则,http或https或file;前端目前只接触这三项。
网络通讯的格式; 请求报文/响应报文;
域名或 IP:电子设备(计算机,服务器)在网络中的唯一标识。
localhost代表本机地址; 127.0.0.1代表本机地址;
端口:应用程序在计算机中的唯一标识。065535之间,01023的端口可能被系统占用。
80是 http 用; 443是 https 用;
2.服务器和express框架
1.express搭建服务器的基本步骤
①、加载 express 模块
②、创建 app 对象
③、编写接口
④、指定端口,启动服务
其中,第④步,可以放到第③步前面
除了,“编写接口”这步,其他三个步骤写法基本固定
2.express中的send()方法
● send方法,用于做出响应
● send 方法的优点:
■ send方法会自动将对象转成JSON格式
■ send会根据响应体,自动设置 Content-Type 响应头
● send 不能响应数字
// 1.创建文件夹 02-express
// 2.初始化: npm init -y
// 3.下载第三方模块 npm i express@4.17.1
// 4.ES6导入 - 'type':'module'
import express from "express";
// 5.创建express实列
const app = express()
// 3.(编写接口)定义路由 路由的定义:请求方法和资源路径与处理函数的对应关系
app.get('/api/getbooks', (req, res) => {
//req请求对象,里面有请求有关的所有数据
//res响应对象,里面有响应有关的所有数据
//res.end(); 是http 模块提供的 功能单一
//res.send();是express框架提供的,功能比较齐全,能够发送对象和字符串
res.send({
status: 200,
msg: '获取图书列表成工',
data: ['三国', '水浒']
})
})
app.post('/api/addbooks', (req, res) => {
res.send({
status: 201,
msg: '添加图书成功'
})
})
//6.开启服务器
app.listen(3000, () => {
console.log('服务已开启,请访问 http://localhost:3000');
});
3.请求参数接收
1.请求路径中的参数,根据所在位置不同有两种:查询参数和路由参数;(get/delete常用)
● 查询参数: req.query
● 路由参数: req.params
2.请求体参数有一种,但是传递参数的类型,常见的有三种;(post/put常用)
● 请求体参数: req.body;
获取请求体参数需要配置一句话,三种类型对应三种不同的配置方式:
app.use( express.urlencode() ); 对应 content-type: application/x-www-form-urlencoded
app.use( express.json() ); 对应 content-type: application/json
const upload = multer({ dest: ‘uploads/’ }) (需要下载)
app.use( upload.single(‘avatar’) ); 对应 multipart/form-data (了解)
3.1 编写路由 -接收查询参数
3.2 编写路由 -接收URL参数/路由参数/动态参数
3.3 编写路由 -请求体参数:application/x-www-form-urlencode
3.4 编写路由 -请求体参数: application/json
3.5 编写路由 -请求体参数:mutipart/form-data
代码部分:
//1.导入
import express from 'express'
//2.创建
const app = express()
//3.1 编写路由 - 接收 查询参数
app.get('/api/getbooks', (req, res) => {
// req.query 专门获取查询参数组成的对象
console.log(req.query);
res.send({
status: 0,
msg: '获取参数成功',
data: req.query
})
})
// 3.2 编写路由 - 接收URL参数/路由参数/动态参数
app.get('/my/article/cates/:id', (req, res) => {
//req.params 专门获取 URL参数/路由参数/动态参数的对象
console.log(req.params);
res.send({
status: 0,
msg: '获取参数成功',
data: req.params
})
})
// 3.3 编写路由 -请求体参数:application/x-www-form-urlencode
// 数据格式为: a=1&b=2&c=3
// 配置一个post请求体接收的中间件; -这句话最好写到所有路由之前!
app.use(express.urlencoded({ extended: false }))
app.post('/api/addbook', (req, res) => {
//req.body可以接收请求体参数,返回一个对象.
console.log(req.body);
res.send({
status: 0,
msg: '获取参数成功',
data: req.body
})
})
// 3.4编写路由 - 请求体参数: application/json
// 数据格式为:'{"a":1,"b":2,"c":3}'
//配置一个post请求体接收的中间件; -这句话最好写到所有路由之前!
app.use(express.json())
app.post('/api/login', (req, res) => {
//req.body可以接收application/x-www-form-urlencode
// 又可以接收 applicatin/json
console.log(req.body);
res.send({
status: 0,
msg: '登录成功',
data: req.body
})
})
// 3.5编写路由 - 请求体参数:mutipart/form-data
// 数据格式为:FormData类型
// 3.5.1 下载multer:npm i multer@1.4.2
// 3.5.2 ES6方式导入
import multer from 'multer';
// 3.5.3 设置上传文件的保存路径
const upload = multer({ dest: './uploads' })
// 3.5.4 使用multer解析FormData类型的数据,实现文件上传
app.post('/my/article/add', upload.single('cover_img'), (req, res) => {
//req.body是普通属性,文本域属性
console.log(req.body)
//req.file是上传文件属性
console.log(req.file)
res.send({
status: 0,
msg: '发表文章成功'
})
})
// 4.启动服务
app.listen(1111, () => {
console.log('http://localhost:1111');
})
请求参数接收总结
- 查询参数: req.query (不需要设置express)
- 路由参数: req.params (不需要设置express)
- 请求体参数:req.body (需要设置express)
● app.use(express.urlencoded()); (接收 a=1&b=2&c=3 类型)
● app.use(express.json()); (接收 json 类型)
const upload = multer({ dest: ‘uploads/’ }) (需要下载)
● app.use( upload.single(‘avatar’) ); 对应 multipart/form-data (了解) (接收 FormData 类型,需要下载后使用)