Node.js入门指南(完结)

目录

接口

介绍

RESTful

json-server

接口测试工具

会话控制

介绍

cookie 

session

token


上一篇文章我们介绍了MongoDB,这一篇文章是Node.js入门指南的最后一篇啦!主要介绍接口以及会话控制。

接口

介绍

接口是前后端通信的桥梁 ,简单理解:一个接口就是服务中的一个路由规则 ,根据请求响应结果 ,接口的英文单词是 API (Application Program Interface),所以有时也称之为 API 接口 。这里的接口指的是『数据接口』, 与编程语言(Java,Go 等)中的接口语法不同。它能够实现 前后端通信。

一个接口一般由如下几个部分组成:请求方法,接口地址(URL),请求参数以及响应结果

RESTful

RESTful API 是一种特殊风格的接口,主要特点有如下几个:

1️⃣URL 中的路径表示资源 ,路径中不能有动词 ,例如 create , delete , update 等这些不能有 。

2️⃣操作资源要与 HTTP 请求方法 对应 。

3️⃣操作结果要与 HTTP 响应状态码对应。

操作

请求类型

URL

返回

新增歌曲

POST

/song

返回新生成的歌曲信息

删除歌曲

DELETE

/song/10

返回一个空文档

修改歌曲

PUT

/song/10

返回更新后的歌曲信息

修改歌曲

PATCH

/song/10

返回更新后的歌曲信息

获取所有歌曲

GET

/song

返回歌曲列表数组

获取单个歌曲

GET

/song/10

返回单个歌曲信息

实例可看以上的表格,每一个请求类型需要对操作资源相应对,我们对GET以及POST都比较熟悉,一个用于获取,一个用于添加。在之前我们同样可以使用GET来进行增加,POST来进行查看,但是RESTful风格的接口不能。PUT以及PATCH两个请求类型都是用于修改数据的,不同点是前者是全部更新,而后者是部分更新

json-server

json-server 本身是一个 JS 编写的工具包,可以快速搭建 RESTful API 服务, 官方地址。使用json-server来创建一个RESTful API 服务,操作步骤如下:

1️⃣ 全局安装json-server:npm i -g json-server

2️⃣ 创建一个json格式的文件,例如db.json,编写基本的结构例如:

{"song": [{"id": 1,"name": "干杯","singer": "五月天"},{"id": 2,"name": "当","singer": "动力火车"},{"id": 3,"name": "不能说的秘密","singer": "周杰伦"}]
}

3️⃣ 以 JSON 文件所在文件夹作为工作目录 ,执行如下命令 :json-server --watch db.json

4️⃣ 打开3000端口,输入对应的请求。

我们发起get请求查询所有的歌曲:http://127.0.0.1:3000/song,得到的结果如下:

接口测试工具

下面介绍几个接口测试工具,有这些工具就可以让我们更加方便地对接口进行发送各种请求的测试,同时也可以快速地生成接口文档。比较流行地有以下的三个

1️⃣ apipost https://www.apipost.cn/

2️⃣ apifox https://www.apifox.cn/

3️⃣ postman https://www.postman.com/ 

我们以第一个为例子,我们首先需要确保我们的json-server服务是启动的,点击安装好的apipost应用,点击创建Http接口。

点击右上角➕号,点击新建接口。

接着选择对应的请求方式以及请求url,添加相应的描述,点击发送,可以在下面看到返回的数据,同时可以点击保存,对接口进行保存。

然后可以继续添加,但是因为我们每一次输入地址时会重复协议域名以及端口号,因此我们可以对其进行统一的配置。点击右上角的眼睛图标。进行相应配置如下:

配置完成之后,我们在写请求路径的时候就只需要写对应的请求资源即可。

同时创建好的多个接口可以放在一个文件夹下面,可以对多个接口设置统一的公共参数。

最后还可以对单个接口进行分享或者对整个项目进行分享,复制内网链接打开即可。

会话控制

介绍

会话是指一个终端用户与交互系统进行通讯的过程。比如我给你带你电话,从☎接通到挂断这整一个过程就可以相当与是一个会话。HTTP 是一种无状态的协议,它没有办法区分多次的请求是否来自于同一个客户端, 无法区分用户。而产品中又大量存在的这样的需求,所以我们需要通过会话控制来解决该问题。常见的会话控制技术有三种: cookie、session以及token。下面我们分别对它们做介绍。

cookie 

cookie 是 HTTP 服务器发送到用户浏览器并保存在浏览器端的一小块数据,每一次用户通过浏览器向服务端发送请求时,就会携带这一小块数据,服务端就可以通过它来识别不同的用户了。cookie 是按照域名划分保存的。不同浏览器中的 cookie 是相互独立的,不共享。

浏览器向服务器发送请求时,会自动将当前域名下可用的 cookie 设置在请求头中,然后传递给服务器。这个请求头的名字也叫 cookie ,所以将 cookie 理解为一个 HTTP 的请求头也是可以的。

它的基本流程是:当我们向服务端发送我们填写好的账号和密码,它会对信息进行校验,校验通过后下发 cookie。有了 cookie 之后,后续向服务器发送请求时,就会自动携带 cookie。服务端就可以识别对应的用户了。

接下来我们在express框架中,对cookie来进行操作。在设置cookie时,当没有设置它的期限时,浏览器关闭之后就会消失,当通过maxAge来设置它的有效期时,在这个期间不管浏览器是否关闭都会保存,当超过时间则会消失。当首次向服务发送请求时,对应的请求头还没有cookie值,当第二次请求时,就可以在发送的请求头中看到携带的cookie值。

//导入express
const express=require('express');
//1. 安装 cookie-parser npm i cookie-parser
//2. 引入 cookieParser 包
const cookieParser=require('cookie-parser');
const app=express();
app.use(cookieParser())//设置cookie
app.get('/set-cookie',(req,res)=>{//设置一分钟之后过期res.cookie('name','N-A',{maxAge:60 * 1000})res.send('home');
});//删除cookie
app.get('/remove-cookie',(req,res)=>{res.clearCookie('name');res.send('删除成功~~');
});//获取cookie
app.get('/get-cookie',(req,res)=>{console.log(req.cookies);res.send(`欢迎你${req.cookies.name}`);
})
app.listen(3000)

session

session 是保存在 服务器端的一块儿数据 ,保存当前访问用户的相关信息 。它可以实现会话控制,可以识别用户的身份,快速获取当前用户的相关信息。

基本流程:填写账号和密码校验身份,校验通过后创建 session 信息 ,然后将 session_id 的值通过响应头返回给浏览器。有了 cookie,下次发送请求时会自动携带 cookie,服务器通过 cookie 中的 session_id 的值确定用户的身份。

接下来我们仍然在express框架中来进行演示操作:

//导入 express
const express = require('express');
//2. 引入 express-session  connect-mongo
const session = require("express-session");
const MongoStore = require('connect-mongo');//创建应用对象
const app = express();
//3. 设置 session 的中间件
app.use(session({name: 'sid',   //设置cookie的name,默认值是:connect.sidsecret: 'atguigu', //参与加密的字符串(又称签名)  加盐saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的idresave: true,  //是否在每次请求时重新保存session  20 分钟    4:00  4:20store: MongoStore.create({mongoUrl: 'mongodb://127.0.0.1:27017/bilibili' //数据库的连接配置}),cookie: {httpOnly: true, // 开启后前端无法通过 JS 操作maxAge: 1000 * 60 * 5 // 这一条 是控制 sessionID 的过期时间的!!!},
}))//首页路由
app.get('/', (req, res) => {res.send('home')
})//登录  session 的设置
app.get('/login', (req, res) => {// username=admin&password=adminif(req.query.username === 'admin' && req.query.password === 'admin'){//设置 session 信息req.session.username = 'admin';req.session.uid = '258aefccc';//成功响应res.send('登录成功');}else{res.send('登录失败~~');}
})//session 的读取
app.get('/cart', (req, res) => {//检测 session 是否存在用户数据if(req.session.username){res.send(`购物车页面, 欢迎您 ${req.session.username}`)}else{res.send('您还没有登录~~');}
});//session 的销毁
app.get('/logout', (req, res) => {req.session.destroy(() => {res.send('退出成功~~');})
})//启动服务
app.listen(3000);

上面介绍了cookie以及session,现在对两者来进行比较,两者的不同点主要有以下四点:

1️⃣ 存在的位置 cookie存放与浏览器端,而session存放与服务端

2️⃣ cookie 是以明文的方式存放在客户端的,安全性相对较低 ,session 存放于服务器中,所以安全性相对较好

3️⃣ cookie 设置内容过多会增大报文体积, 会影响传输效率 。session 数据存储在服务器,只是通过 cookie 传递 id,所以不影响传输效率。

4️⃣ 浏览器限制单个 cookie 保存的数据不能超过 4K ,且单个域名下的存储数量也有限制 ,session 数据存储在服务器中,所以没有这些限制

token

token 是服务端生成并返回给 HTTP 客户端的一串加密字符串, token 中保存着 用户信息 。实现会话控制,可以识别用户的身份,主要用于移动端 APP。

基本流程:填写账号和密码校验身份,校验通过后响应 token,token 一般是在响应体中返回给客户端的。后续发送请求时,需要手动将 token 添加在请求报文中,一般是放在请求头中 。

token 的特点:它的数据存储在客户端因此服务端压力更小相对更安全,它进行了数据加密,可以避免 CSRF(跨站请求伪造)。扩展性更强,服务间可以共享,增加服务节点更简单。

最后介绍一个包JWT。JWT(JSON Web Token )是目前最流行的跨域认证解决方案,可用于基于 token 的身份验证。JWT 使 token 的生成与校验更规范。使用 jsonwebtoken 包 来操作 token,代码如下:

//安装包:npm i jsonwebtokan
//导入 jsonwebtokan
const jwt = require('jsonwebtoken');
//创建 token
// jwt.sign(数据, 加密字符串, 配置对象)
let token = jwt.sign({
username: 'zhangsan'
}, 'atguigu', {
expiresIn: 60 //单位是 秒
})
//解析 token
jwt.verify(token, 'atguigu', (err, data) => {
if(err){
console.log('校验失败~~');
return
}
console.log(data);
})

好啦!本文就到这里结束啦,感谢阅读~~   这段时间连续出了五六篇Node.js文章,写的时间远大于学的时间,就是想要总结记录下来,方便后续可以查看同时分享给有需要的小伙伴。几乎每一篇都是在凌晨之后发布的 ┭┮﹏┭┮。希望不会辜负这些时间。觉得写得不错的小伙伴也可以点点赞。后续还有一篇Node.js案例实践,可以关注关注!

Node.js入门指南(一)icon-default.png?t=N7T8http://t.csdnimg.cn/YdIh0Node.js入门指南(二)icon-default.png?t=N7T8http://t.csdnimg.cn/X990ENode.js入门指南(三)icon-default.png?t=N7T8http://t.csdnimg.cn/vEkLnNode.js入门指南(四)icon-default.png?t=N7T8http://t.csdnimg.cn/WnSYINode.js入门指南(五)icon-default.png?t=N7T8http://t.csdnimg.cn/RimI1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity动画】Unity 动画播放的流程

本文以2D为案例,讲解Unity 播放动画的流程 准备和导入2D动画资源 外部导入序列帧生成的 Unity内部制作的 外部导入的3D动画 2.创建动画过程 打开时间轴Ctrl6 选中场景中的一个未来需要播放动画的物体 回到时间轴点击Create一个新动画片段 拖动2D动画资源放入…

【数据结构和算法】到达首都的最少油耗

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 三、代码 四、复杂度分析 前言 这是力扣的2477题,难度为中等,解题方案有很多种&…

Interpretable Multimodal Misinformation Detection with Logic Reasoning

原文链接 Hui Liu, Wenya Wang, and Haoliang Li. 2023. Interpretable Multimodal Misinformation Detection with Logic Reasoning. In Findings of the Association for Computational Linguistics: ACL 2023, pages 9781–9796, Toronto, Canada. Association for Computa…

前后端验证码分析(字母计算)

样式&#xff1a; 前端&#xff1a; login.vue <template> <view class"normal-login-container"> <view class"login-form-content"> <view class"input-item flex align-center"> <view class"iconfont ic…

【Android】解决安卓中并不存在ActivityMainBinding

安卓中并不存在ActivityMainBinding这个类&#xff0c;这个类是在XML布局的最外层加入就会自动生成。但是你在最后绑定主布局时会报错获取不到根节点getRoot(). 最好的办法就是&#xff0c;删除原来的最外层节点&#xff0c;再重新添加&#xff0c;感觉是因为复制时并没有让系…

基于阿里云服务网格流量泳道的全链路流量管理(一):严格模式流量泳道

作者&#xff1a;尹航 概述 灰度发布是一种常见的对新版本应用服务的发布手段&#xff0c;其特点在于能够将流量在服务的稳定版本和灰度版本之间时刻切换&#xff0c;以帮助我们用更加可靠的方式实现服务的升级。在流量比例切换的过程中&#xff0c;我们可以逐步验证新版本服…

人工智能时代AIGC绘画实战

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

编译WSL内核,用于操作usb读卡器

wsl2默认不能操作usb读卡器&#xff0c;但是对于嵌入式linux开发来说&#xff0c;需要经常对tf卡进行操作&#xff0c;随时都会使用到usb读卡器的访问。下面讲述如何开启wsl2的usb读卡器的访问&#xff0c;主要涉及到以下2个步骤&#xff1a; wsl2本质是一个虚拟机&#xff0c…

C++作业5

完成沙发床的多继承&#xff08;有指针成员&#xff09; 代码&#xff1a; #include <iostream>using namespace std;class Bed { private:double *money; public:Bed(){cout << "Bed::无参构造函数" << endl;}Bed(double money):money(new doub…

【Latex笔记】标题页

整体结构 模板结构如下&#xff1a; \documentclass{book} % 导言区&#xff0c;加载宏包和各项设置&#xff0c;包括参考文献、索引等 \usepackage{makeidx} % 调用makeidx 宏包&#xff0c;用来处理索引 \makeindex % 开启索引的收集 \bibliographystyle{plain} % 指定参考…

010 数据结构_红黑树

前言 本文将会向你介绍红黑树的概念、性质&#xff0c;以及如何手撕红黑树 1 文章重点 文本首先引入红黑树的概念和性质&#xff0c;性质非常重要对于后面的插入操作来说&#xff0c;文章的核心放在了插入部分&#xff0c;另外看插入部分之前记得看声名和节点的定义哦~ 2 引…

嵌入式门槛高吗?

今日话题&#xff0c;嵌入式门槛高吗&#xff1f;在嵌入式领域&#xff0c;门槛因公司和职位的不同而异。普通的嵌入式岗位门槛相对较低&#xff0c;通常要求掌握一些C语言编程和单片机相关知识&#xff0c;可以制作简单的电子产品&#xff0c;但相应的工资较低。然而&#xff…

解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app

错误场景 更新了IOS的系统版本为最新的17.0, 运行报以下错误 Launching lib/main.dart on iPhone in debug mode... Automatically signing iOS for device deployment using specified development team in Xcode project: GN3DCAF71C Running Xcode build... Xcode build d…

典型的ETL使用场景

典型的ETL使用场景 ETL( Extract&#xff0c;Transform&#xff0c;Load)是一种用于数据集成和数据转换的常用技术。它主要用于从多个数据源中提取数据&#xff0c;对数据进行清洗、转换和整合&#xff0c;最后加载到目标系统中。ETL 的使用场景非常广泛&#xff0c;下面将介绍…

Theamleaf导出pdf模版编写(原始th/td编写表格)

需求&#xff1a;简单的theamleaf编写表格就是简单的th/td&#xff0c;新需求是导出的模版是学员table表&#xff0c;每个项目的学员数量是不定的&#xff0c;所以用到 <tr th:each"item,start:${studentList}"> 所有代码&#xff1a; <!DOCTYPE html>…

python 实现 AIGC 大模型中的概率论:生日问题的基本推导

在上一节中&#xff0c;我们对生日问题进行了严谨的阐述&#xff1a;假设屋子里面每个人的生日相互独立&#xff0c;而且等可能的出现在一年 365 天中的任何一天&#xff0c;试问我们需要多少人才能让某两个人的生日在同一天的概率超过 50%。 处理抽象逻辑问题的一个入手点就是…

【bash指令全集合】最全教程-持续更新!

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于新西兰奥克兰大学攻读IT硕士学位。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。跨领域…

Centos7.4安装nginx1.24.0_安装详细步骤---Linux工作笔记066

以前安装的太模糊了,干脆重新写一个: 1.首先下载对应的nginx-1.24.0.tar.gz安装文件 2.然后: 去执行命令 安装依赖 yum install -y gcc yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel 3.然后:去解压 tar -zxvf ngi…

一文讲透Python机器学习决策树算法的基本概念与原理

1.决策树算法的基本特点与优势 决策树算法是一种有监督、非参数、简单、高效的机器学习算法。相对于非监督式学习方法&#xff0c;决策树算法由于充分利用了响应变量的信息&#xff0c;因此能够很好地克服噪声问题&#xff0c;在分类及预测方面效果更佳。决策树的决策边界为矩…

【MySQL】MySQL数据库基础

MySQL数据库基础 一、为什么要有数据库&#xff1f;二、 数据库软件的构成数据库服务器&#xff0c;数据库&#xff0c;表关系主流数据库 三、基本使用1、连接服务器2、服务器管理3、MySQL配置文件4、数据库的简单操作5、数据逻辑存储 四、MySQL架构SQL分类MySQL客户端存储引擎…