Node js的执行机制 服务器和express框架

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');
})

请求参数接收总结

  1. 查询参数: req.query (不需要设置express)
  2. 路由参数: req.params (不需要设置express)
  3. 请求体参数: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 类型,需要下载后使用)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值