【H2O2|全栈】Node.js(3)

目录

前言

开篇语

准备工作

get和post登录校验测试

准备

创建应用

数据

端口监听

get方式校验

代码

测试

​编辑

post方式校验

代码

测试

中间件

概念

流程

结束语


前言

开篇语

本系列博客分享Node.js的相关知识点,本章讲解登录校验原理和中间件。

与基础部分的语法相比,ES6的语法进行了一些更加严谨的约束和优化,因此,在之后使用原生JS时,我们应该尽量使用ES6的语法进行代码编写。

准备工作

软件:【参考版本】Visual Studio Code,Postman

插件(扩展包):Open in browser, Live Preview, Live Server, Tencent Cloud AI Code Assistant, htmltagwrap

提示:在不熟练的阶段建议关闭AI助手

系统版本: Win10/11

提示:node.js在当前文件夹下使用cmd运行,不在浏览器解析运行

get和post登录校验测试

准备

在上一期中,我们已经完成了服务器的创建和运行,我们也知道了应用的常见请求方式。

今天,我们通过一种常见的需求——登录校验,来加深对get和post请求的理解。

在这一次的登录测试中,我们使用Postman发送请求数据,不涉及前端页面,数据库内容默认已经拿到,所以不连接数据库。

创建应用

首先,在01.登录.js文件中使用express创建应用(express的内容详见上一期)——

const express = require("express")
const app = express()

数据

我们假设已经获取了数据库的数据,以JSON对象数组的形式保存在data目录下的user.json文件中。

user.json中的数据如下——

[{"username":"admin","pwd":"123456"},{"username":"zhangsan","pwd":"123456"},{"username":"lisi","pwd":"123456"}
]

我们在01.登录.js中使用require导入数据数组——

const users = require("./data/user.json")

端口监听

我们选用3000端口进行连接,使用listen()进行监听——

app.listen(3000, "127.0.0.1", () => {console.log("http://127.0.0.1:3000");
})

get方式校验

代码

这里我们假设登录的路由地址为 /login。

get请求有?传参路径传参两种方式,这里我们以?传参为例。

?传参             query:         url?key=value

路径传参        params:      url/:key1/:key2.....

在处理函数中,使用解构赋值接收传入的两个参数username(用户名)和pwd(密码)。

const { username, pwd } = req.query;

由于用户名是唯一的(键),所以我们可以使用数组的find()方法,查找users中是否有我们所需要的username,并用user接收查找到的对象。

const user = users.find(item => item.username == username)

接下来,我们需要判断用户名是否存在,如果不存在,则find()将返回null给我们,此时为用户响应“用户不存在”,直接return结束get请求。

在用户名存在的情况下,判断user的pwd属性是否与输入值相同,不同时响应“密码错误”。

如果输入没有问题,则提示用户登录成功。

if (!user) {return res.send("用户名不存在!")
}
if (user.pwd != pwd) {return res.send("密码错误!")
}
res.send("登录成功")

完整的get请求校验代码如下——

app.get("/login", (req, res) => {const { username, pwd } = req.query;const user = users.find(item => item.username == username);if (!user) {return res.send("用户名不存在!");}if (user.pwd != pwd) {return res.send("密码错误!");}res.send("登录成功");
})

测试

下面,我们使用Postman来测试这个登录的功能能否完成。

首先,我们在地址栏输入正确的登录信息用户名admin和密码123456——

点击发送,在控制台显示登录成功。

然后我们测试错误的情况,例如我们输入一个错误的密码——

点击发送,在控制台显示密码错误。

post方式校验

代码

post方式校验的过程与get几乎相同,但是post请求的数据在虚拟载体(请求体,body)中,所以我们需要把第一步的解构赋值换成下面的代码——

const { username, pwd } = req.body;

但是,我们直接来拿body的内容是拿不到的,需要使用到中间件body-parser的帮助,中间件的内容在下一节中。

使用npm下载body-parser,并使用express导入。

var bodyParser = require('body-parser')

如果请求方式为application/x-www-form-urlencoded,则使用urlencoded()中间件;如果请求方式为application/json,则使用json()中间件。

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

其余代码与get方式相同。 

测试

post方式的校验测试需要我们在body中传输数据。 

post方式请求不使用地址,所以路由地址到login即可,注意把请求方式更换为post。

比如,我们使用x-www-form-urlencoded方式请求,首先在Postman中配置请求头——

然后,在body中选择该种方式,并输入用户名和密码——

点击发送,控制台提示登录成功。

错误的登录信息测试略。

中间件

概念

中间件是一类介于两个不同系统之间的组件,它可以在两个系统之间传递、处理、转换数据,以达到协同工作的目的。 

通过中间件,应用程序可以更加灵活地处理请求和响应

在本节中,我们使用express提供的中间件。

流程

为了更加方便地理解中间件,我们借助自来水厂的生产流程来编写代码。

我们可以将中间件理解为生产流程中的各个环节,而自来水厂通常来说有下面的生产步骤——

沉淀、过滤、增压...

我们利用use()来使用中间件,它可以接受两个参数——路径和处理函数。

不添加路径,表示作为所有路由的中间件;添加路径,表示作为指定路由路径的中间件。

这里我们不添加路由路径。

在处理函数中,接收三个参数——req,res,next

req为请求,在所有使用相同路径的中间件中通用。res为响应,可以调用send()响应数据。next为放行下一步,可以调用下一个中间件

下面,我们将这三个步骤实现,并使过滤步骤在/home路径下,增压步骤在/list路径下——

// 沉淀
app.use((req,res,next) => {console.log("沉淀....");next()
})
// 过滤
app.use("/home",(req,res,next) => {console.log("过滤....");next()
})
// 增压
app.use("/list",(req,res,next) => {console.log("增压....");next()
})

然后,我们为req添加三个参数a,b,c——

// 沉淀
app.use((req,res,next) => {console.log("沉淀....");req.a = "沉淀a"next()
})
// 过滤
app.use("/home",(req,res,next) => {console.log("过滤....");req.b = "过滤b"next()
})
// 增压
app.use("/list",(req,res,next) => {console.log("增压....");req.c = "增压c"next()
})

在get请求中,测试不同路径下req是否可以拿到这三个数据(即完成的“生产步骤”)——

app.get("/home",(req,res) => {res.send(`home....${req.a},${req.b},${req.c}`)
})app.get("/list",(req,res) => {res.send(`list....${req.a},${req.b},${req.c}`)
})

我们发现,/home路径下完成了沉淀和过滤,而/list路径下完成了沉淀和增压——

结束语

本期内容到此结束。关于本系列的其他博客,可以查看我的Node.js入门专栏。

在全栈领域,博主也只不过是一个普通的萌新而已。本系列的博客主要是记录一下自己学习的一些经历,然后把自己领悟到的一些东西总结一下,分享给大家。

文章全篇的操作过程都是笔者亲自操作完成的,一些定义性的文字加入了笔者自己的很多理解在里面,所以仅供参考。如果有说的不对的地方,还请谅解。

==期待与你在下一期博客中再次相遇==

——临期的【H2O2】

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

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

相关文章

mysql之基本常用的语法

mysql之基本常用的语法 1.增加数据2.删除数据3.更新/修改数据4.查询数据4.1.where子句4.2.order by4.3.limit与offset4.4.分组与having4.5.连接 5.创建表 1.增加数据 insert into 1.指定列插入 语法:insert into table_name(列名1,列名2,....,列名n) values (值1,值…

ASUS/华硕天选5Pro酷睿版 FX607J 原厂Win11 23H2系统 工厂文件 带ASUS Recovery恢复

华硕工厂文件恢复系统 ,安装结束后带隐藏分区,一键恢复,以及机器所有驱动软件。 系统版本:windows11 原厂系统下载网址:http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意:仅支持以上型号专用…

详解HTML5语言

文章目录 前言任务一 认识HTML5任务描述:知识一 HTML5基础知识 任务二 HTML 5语义元素任务描述:知识一 HTML5新增结构元素知识二 HTML5文本语义元素 总结 前言 HTML5是一个新的网络标准,现在仍处于发展阶段。目标是取代现有的HTML 4.01和XHT…

【VBA实战】使用Word制作简易的考试及阅卷系统

这个事源于公司想简化面试流程,希望能通过一些简单的笔试及自动阅卷来提高对候选人的初步筛选工作的效率和准确性。我当时的想法是这样的: 1. 利用AI工具生成一个笔试题库,只要选择题和填空题 2. 利用VBA工具,根据需求自动从题库…

qt QToolBox详解

1、概述 QToolBox是Qt框架中的一个控件,它提供了一个带标签页的容器,用户可以通过点击标签页标题来切换不同的页面。QToolBox类似于一个带有多页选项卡的控件,但每个“选项卡”都是一个完整的页面,而不仅仅是标签。这使得QToolBo…

【LeetCode每日一题】——189.轮转数组

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【题目进阶】八【解题思路】九【时空频度】十【代码实现】十一【提交结果】 一【题目类别】 数组 二【题目难度】 中等 三【题目编号】 189.轮转数组 四【题目描述】 …

Spring Boot英语知识网站:架构与开发

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

Mac 系统上控制台常用性能查看命令

一、top命令显示 在macOS的控制台中,top命令提供了系统当前运行的进程的详细信息以及整体系统资源的利用情况。下面是对输出中各个字段的解释: Processes: 483 total: 系统上总共有483个进程。 2 running: 当前有2个进程正在运行。 481 sleeping: 当前有…

捉虫笔记(七)-再探谁把系统卡住了

捉虫笔记(七)-再探谁把系统卡住 1、内核调试 在实体物理机上,内核调试的第一个门槛就是如何建立调试链接。 这里我选择的建立网络连接进行内核调试。 至于如何建立网络连接后续文章再和大家分享。 2、如何分析 在上一篇文章中,我们…

SpringBoot(四十三)SpringBoot集成xxl-job分布式任务调度平台

这里我来记录一下Springboot项目集成xxl-job分布式任务调度平台及使用的过程。 一:xxl-job介绍 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 xxl-job是一个开源的分布式定时…

Rook入门:打造云原生Ceph存储的全面学习路径(下)

文章目录 六.Rook部署云原生CephFS文件系统6.1 部署cephfs storageclass6.2 创建容器所需cephfs文件系统6.3创建容器pod使用rook-cephfs提供pvc6.4 查看pod是否使用rook-cephfs 七.Ceph Dashboard界面7.1 启用dashboard开关7.2 ceph-dashboard配置外部访问7.3 Dashboard web ad…

java:aqs实现自定义锁

aqs采用模板方式设计模式,需要重写方法 package com.company.aqs;import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock;…

Centos 使用宝塔安装mysql详细步骤

安装宝塔 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh输入y 2直接在网页访问下载安装3.安装mysql 如图 输入 mysql -u root -p 然后输入密码 密码如何可以设置默认有一个可以直接用修改密…

电动工具领域可推荐的一些调速控制电路,运算放大器芯片等相关型号

电动工具调速控制电路芯片 GS069:该芯片是专门为电动工具调速控制而设计的芯片,通过调节电机的转速,满足不同工作场景下对电动工具转速的需求,从而实现诸如钻孔、拧紧螺丝等不同操作的速度控制. 运算放大器芯片 D8541/2&#xff…

ZooKeeper 基础知识总结

先赞后看,Java进阶一大半 ZooKeeper 官网这样介绍道:ZooKeeper 是一种集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。 各位hao,我是南哥,相信对你通关面试、拿下Offer有所帮助。 ⭐⭐⭐一份南哥编写…

玩转 Burp Suite (1)

内容预览 ≧∀≦ゞ 玩转 Burp Suite (1)声明Burp Suite 简介Dashboard(仪表盘)1. 默认任务管理2. 暂停任务3. 新建扫描任务4. 使用总结 Target(目标)1. SIte Map (站点地图)2. Scope(范围&#…

BGP协议路由黑洞

一、实验环境 1、分公司与运营商AS自治系统内运行IGP路由协议OSPF、RIP或静态路由,AS自治系统内通过IBGP路由协议建立BGP邻居关系。 2、公司AS自治系统与运营商AS自治系统间运行EBGP路由协议。 3、通过loopback建立IBGP与EBGP邻居关系,发挥loopback建立…

ThinkPHP Nginx 重写配置

目录 NGINX 重写 Admin项目隐藏入口文件,且禁用Admin模块&Admin.php 1️⃣配置仅用模块 2️⃣新增admin_xyz.php文件(自定义入口文件名),并绑定admin模块 3️⃣配置nginx 重写规则 NGINX 重写 在Nginx低版本中&#xff0…

k8s集群增加nfs-subdir-external-provisioner存储类

文章目录 前言一、版本信息二、本机安装nfs组件包三、下载nfs-subdir-external-provisioner配置文件并进行配置1.下载文件2.修改配置 三、进行部署备注:关于镜像无法拉取问题的处理 前言 手里的一台服务器搭建一个单点的k8s集群,然后在本机上使用nfs-su…

百度 文心一言 vs 阿里 通义千问 哪个好?

背景介绍: 在当前的人工智能领域,随着大模型技术的快速发展,市场上涌现出了众多的大规模语言模型。然而,由于缺乏统一且权威的评估标准,很多关于这些模型能力的文章往往基于主观测试或自行设定的排行榜来评价模型性能…