当前位置: 首页 > news >正文

【综合项目】api系统——基于Node.js、express、mysql等技术

目录

0 前言 

1 初始化

2 注册登录 

2.1 注册

2.1.1 功能:密码加密(2.3.3)

2.1.1.1 操作 

2.1.1.2 bcryptjs详解

2.1.2 优化:表单数据验证(2.5)

2.1.2.1 过时代码修正

2.1.2.2 关键操作


0 前言 

本章仅记录部分功能代码(以前文章中未涉及的新内容)以及所遇到的问题

详细内容见  项目首页 - api系统 - GitCode  中的指导文档

❗❗❗最终完整代码也会上传至GitCode中,收藏方便查找

注:部分标题后面跟了原文档中的序号,方便查看


1 初始化

此部分暂无内容


2 注册登录 

2.1 注册

2.1.1 功能:密码加密(2.3.3)

2.1.1.1 操作 

使用 bcryptjs 对用户密码进行加密 

安装指定版本的 bcryptjs :

npm i bcryptjs@2.4.3

导入 bcryptjs :

const bcrypt = require('bcryptjs')

在注册用户的处理函数中,确认用户名可用之后,调用 bcrypt.hashSync(明文密码, 随机盐的长度) 方法,对用户的密码进行加密处理:

// 对用户的密码,进行 bcrype 加密,返回值是加密之后的密码字符串
userinfo.password = bcrypt.hashSync(userinfo.password, 10)

2.1.1.2 bcryptjs详解

bcrypt.hashSync 是 `bcrypt` 库中用于同步生成哈希值的函数,在 Node.js 中经常使用该库来对密码等敏感信息进行哈希处理。以下详细介绍 bcrypt.hashSync 函数的参数:

函数

bcrypt.hashSync(data, saltOrRounds);

参数说明

1. data
类型:string
描述:需要进行哈希处理的数据,通常是用户的密码。这是一个必需的参数,代表你要加密的原始文本。

2. saltOrRounds
类型:string 或 number
描述:该参数可以是一个盐值(string 类型),也可以是生成盐的轮数(number 类型)。

当 saltOrRounds 为 number 类型时
它代表生成盐的轮数,也称为成本因子(cost factor)。这个值越大,生成盐和哈希值所花费的时间就越长,安全性也相对更高。推荐的值通常在 10 - 12 之间。
bcrypt 会根据这个轮数自动生成一个随机的盐值,然后使用这个盐值对 data 进行哈希处理。

当 saltOrRounds 为 string 类型时
它代表一个预先定义好的盐值。使用自定义盐值时,每次使用相同的盐和数据进行哈希处理,会得到相同的哈希结果。
一般情况下,不建议手动指定盐值,因为 bcrypt 自动生成的随机盐值可以更好地保证安全性。

返回值

bcrypt.hashSync 函数会返回一个包含盐值和哈希值的字符串,这个字符串可以安全地存储在数据库中,用于后续的密码验证。


2.1.2 优化:表单数据验证(2.5)

2.1.2.1 过时代码修正

const joi = require('@hapi/joi') 的写法现在已经失效,

应该这样导入:const joi = require('joi')


2.1.2.2 关键操作

安装 @hapi/joi 包,为表单中携带的每个数据项,定义验证规则:

npm install @hapi/joi@17.1.0

安装 @escook/express-joi 中间件,来实现自动对表单数据进行验证的功能:

 npm i @escook/express-joi

常用验证规则:

 /**
 * string() 值必须是字符串
 * alphanum() 值只能是包含 a-zA-Z0-9 的字符串
 * min(length) 最小长度
 * max(length) 最大长度
 * required() 值是必填项,不能为 undefined
 * pattern(正则表达式) 值必须符合正则表达式的规则
 */

注意:一定要先指定一种数据类型string()或者其他(包括any()),然后才能执行后续操作


导出规则

// 注册和登录表单的验证规则对象
exports.reg_login_schema = {
// 表示需要对 req.body 中的数据进行验证
  body: {
    username,
    password,
  },
 }

使用规则

 // 1. 导入验证表单数据的中间件
const expressJoi = require('@escook/express-joi')
 // 2. 导入需要的验证规则对象
const { reg_login_schema } = require('../schema/user')


//...


router.post('/reguser', expressJoi(reg_login_schema), userHandler.regUser)

持续更新中...

相关文章:

  • 穷举vs暴搜vs深搜vs回溯vs剪枝(典型算法思想)—— OJ例题算法解析思路
  • 【java进阶】java多态深入探讨
  • C# | GDI+图像测距辅助线的实现思路
  • 企业知识库搭建:14款开源与免费系统选择
  • OpenAI开放Deep Research权限,AI智能体大战升级,DeepSeek与Claude迎来新对决
  • 【质量管理】怎么评估职能部门当前质量管理成熟度
  • Innodb MVCC实现原理
  • 【Java学习】Object类与接口
  • qt-C++笔记之QtCreator新建项目即Create Project所提供模板的逐个尝试
  • deepseek 本地化部署(小白也可部署)
  • SQL------搭建sql靶场和打开sql靶场及报错解决
  • 清华deepseek文档下载地址,DeepSeek:如何赋能职场应(附下载包)64页全面详细介绍(二)
  • PCL源码分析:曲面法向量采样
  • 【Python网络爬虫笔记】14-使用代理绕过访问限制
  • [java基础-JVM篇]2_垃圾收集器与内存分配策略
  • Jmeter聚合报告导出log文档,Jmeter聚合报告导出到CSV
  • 量子计算可能改变世界的四种方式
  • 基于Spring Security 6的OAuth2 系列之二十四 -响应式编程之一
  • 图像处理之图像边缘检测算法
  • 数据结构之各类排序算法代码及其详解
  • 此前显示售罄的火车票“五一”前大量放出来了?12306回应
  • 杭州挂牌临平区两宗住宅用地,起始总价约11.02亿元
  • 新片|《我仍在此》定档5月,《新·驯龙高手》同步北美上映
  • 上海市十六届人大常委会第二十一次会议表决通过有关人事任免事项
  • 深入贯彻中央八项规定精神学习教育中央指导组培训会议召开
  • 俄宣布停火三天,外交部:希望各方继续通过对话谈判解决危机