Node编写用户注册接口

目录

前言

创建服务器

编写注册接口API

创建路由对象,将路由对象导出去

将路由对象导出到服务器中

判断用户发起注册请求时是否输入账号或密码

验证表单数据

在数据库中创建表

在node中绑定mysql数据库

判断用户注册的账号密码是否已经被注册

密码加密

完整代码


前言

本文将介绍如何使用node编写用户注册接口

创建服务器

需要安装express模块以及cors跨域模块

express

npm i express

cors跨域模块

npm i cors

因为注册发起的是post请求,所以需要配置解析表单数据的中间件

// 配置解析表单数据中间件
app.use(express.urlencoded({extended:false}))

创建服务器完整代码

// 导入express模块
const express = require('express')// 创建express服务器实例
const app = express()// 导入跨域cors
const cors = require('cors')// 全局挂载
app.use(cors())// 配置解析表单数据中间件
app.use(express.urlencoded({extended:false}))// 启动服务器
app.listen(3007,()=> {console.log('running the http://127.0.0.1:3007');
})

然后启动服务器

编写注册接口API

单独创建一个router文件夹,创建user.js文件

创建路由对象,将路由对象导出去
const express = require('express')// 创建路由对象
const router = express.Router()router.post('/reguser',(req,res)=>{res.send('注册成功')
})module.exports = router
将路由对象导出到服务器中

在发起请求时,多一个api

// 导入用户路由对象
const userRouter = require('./router/user')
app.use('/api',userRouter)

使用postman模拟发送请求,验证接口是否能用

判断用户发起注册请求时是否输入账号或密码
router.post('/reguser',(req,res)=>{const userinfo = req.bodyif(!userinfo.username||!userinfo.password){return res.send({status:1,message:'请输入正确的账号和密码'})}
})

使用postman模拟发送请求,看是否生效

验证表单数据

自定义账号和密码的输入规则,防止用户乱输入

安装自定义验证规则的包

npm i joi

导包

const joi = require('joi')

自定义验证规则

/*** string() 值必须是字符串* alphanum() 值只能是包含 a-zA-Z0-9 的字符串* min(length) 最小长度* max(length) 最大长度* required() 值是必填项,不能为 undefined* pattern(正则表达式) 值必须符合正则表达式的规则*/// 用户名的验证规则
const username = joi.string().alphanum().min(1).max(10).required()
// 密码的验证规则
const password = joi.string().pattern(/^[\S]{6,12}$/).required()

定义验证规则对象

// 验证规则对象
const reg_login_schema={body:{username,password}}

实现对表单自动验证功能

安装

npm i @escook/express-joi

导入

// 1. 导入验证表单数据的中间件
const expressJoi = require('@escook/express-joi')

在请求中验证

//注册
router.post('/reguser',expressJoi(reg_login_schema),(req,res)=>{})//登录
router.post('/login',expressJoi(reg_login_schema),(req,res)=>{})

在服务器中,全局挂载错误捕获

const joi = require('joi')// 错误中间件
app.use(function (err, req, res, next) {// 数据验证失败if (err instanceof joi.ValidationError) return res.cc(err)// 未知错误res.cc(err)
})

使用postman模拟发起注册请求

在数据库中创建表

关于如何创建数据库以及表在常用的SQL语句这篇文章中有介绍

创建好表

在node中绑定mysql数据库

如何在node中引入mysql数据库以及增删改查在博主在node中操作mysql数据库这篇文章中有介绍

单独创建一个文件存放mysql

创建db文件夹,新建index.js文件.导入mysql模块

// 导入 mysql 模块
const mysql = require('mysql')// 创建数据库连接对象
const db = mysql.createPool({host: '127.0.0.1',user: 'root',password: 'qpalzm123',database: 'my_db_01',
})// 向外共享 db 数据库连接对象
module.exports = db

将数据库对象引入到router文件中

// 导入数据库模块
const db = require('../../db/index')
判断用户注册的账号密码是否已经被注册
// 定义sql语句const sql = 'select * from ev_users where username=?'db.query(sql,userinfo.username,(err,results)=>{// 执行sql语句失败if(err){return res.send({status:1,message:err.message})}// 用户名被占用if (results.length > 0) {return res.send({ status: 1, message: '用户名被占用,请更换其他用户名!' })}res.send('注册成功')})

我们在表中提前添加了一组数据

使用postman发送请求验证

当用户输入已经存在的账号密码时

当输入新的账号时

注册成功时,向数据库内添加用户数据

// 插入新用户const sql = 'insert into ev_users set ?'db.query(sql, { username: userinfo.username, password: userinfo.password }, function (err, results) {// 执行 SQL 语句失败if (err) return res.send({ status: 1, message: err.message })// SQL 语句执行成功,但影响行数不为 1if (results.affectedRows !== 1) {return res.send({ status: 1, message: '注册用户失败,请稍后再试!' })}// 注册成功res.send({ status: 0, message: '注册成功!' })})

注册成功

在数据库中查看用户数据是否添加成功

再次提交相同的账号

密码加密

因为明文密码十分危险,一但数据库被盗取,用户信息将会很危险,所以需要给密码加密

使用bcryptjs进行加密

安装

npm i bcryptjs

导入模块

const bcrypt = require('bcryptjs')

bcryptjs使用

bcryptjs.hashSync(明文密码,随机盐的长度)

所以在向数据库插入新数据前,对密码进行加密

// 密码加密userinfo.password=bcrypt.hashSync(userinfo.password,10)

注册新用户,用户名b,密码为000000

在数据库中

密码被成功加密

这样注册接口API就已经成功编写完成

完整代码

注册接口完整代码

需要导出到服务器中挂载使用

// 导入express模块
const express = require('express')
// 导入数据库对象
const db = require('../db/index')// 导入加密模块
const bcrypt = require('bcryptjs')// 创建路由对象
const router = express.Router()router.post('/reguser',(req,res)=>{const userinfo = req.bodyif(!userinfo.username||!userinfo.password){return res.send({status:1,message:'请输入正确的账号和密码'})}// 定义sql语句const sql = 'select * from ev_users where username=?'db.query(sql,userinfo.username,(err,results)=>{// 执行sql语句失败if(err){return res.send({status:1,message:err.message})}// 用户名被占用if (results.length > 0) {return res.send({ status: 1, message: '用户名被占用,请更换其他用户名!' })}// 密码加密userinfo.password=bcrypt.hashSync(userinfo.password,10)// 插入新用户const sql = 'insert into ev_users set ?'db.query(sql, { username: userinfo.username, password: userinfo.password }, function (err, results) {// 执行 SQL 语句失败if (err) return res.send({ status: 1, message: err.message })// SQL 语句执行成功,但影响行数不为 1if (results.affectedRows !== 1) {return res.send({ status: 1, message: '注册用户失败,请稍后再试!' })}// 注册成功res.send({ status: 0, message: '注册成功!' })})})
})module.exports=router

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

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

相关文章

水质分析仪器升级新功能

水质分析仪器:是一种适用于水质多参数测试的便携式仪器。它具有7英寸的触摸彩色屏幕,用户可以通过触摸屏幕进行操作和查看测试结果。 该仪器主要用于测定COD,氨氮,总磷,总氮等常规水质指标,pH值、溶解氧、…

CVer从0入门NLP(一)———词向量与RNN模型

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊专栏推荐:深度学习网络原理与实战 🍊近期目标:写好专栏的每一篇文章 🍊支持小苏:点赞👍🏼、…

rancher2.6.4配置管理k8s,docker安装

docker快速安装rancher并管理当前k8s集群。 1、拉镜像 docker pull rancher/rancher:v2.6.4 2、启动rancher 启动很慢 --privileged必须拥有root权限,并挂载卷 docker run --privileged -d --restartunless-stopped -p 80:80 -p 443:443 -v /usr/local/docker_vo…

模拟经营微信小游戏-休闲餐厅上线了

《休闲餐厅》是一款关于餐厅经营的小游戏,玩家可以在游戏中扮演餐厅老板,经营自己的休闲餐厅,收集美丽的厨娘,炒菜、做饭、卖钱、装饰餐厅,享受经营的乐趣。 在游戏中,玩家可以解锁几百种菜品,每…

【JS的设计模式一】

本文参考书籍 《JavaScript设计模式与开发实践》 在 JavaScript 编程中,this 关键字总是让人感到迷惑,Function.prototype.call 和 Function.prototype.apply 这两个方法也有着广泛的运用。我们有必要在学习设计模式之前先理解 这几个概念。 this Java…

百度Comate代码助手全新上线SaaS服务,助力企业释放10倍软件生产力!

“1024”程序员节来临之际,百度智能云宣布百度Comate智能代码助手正式上线SaaS版本,可提供10余项编码功能,适配100种开发语言,面向广大企业和开发者提供更便捷、更灵活的智能编码工具,助力企业提升研发效率。即日起企业…

python控制Windows桌面程序自动化模块uiautomation

github仓库地址:GitHub - yinkaisheng/Python-UIAutomation-for-Windows: (Donot use 3.7.6,3.8.1):snake:Python 3 wrapper of Microsoft UIAutomation. Support UIAutomation for MFC, WindowsForm, WPF, Modern UI(Metro UI), Qt, IE, Firefox, Chrome ... uiaut…

领域驱动设计:基于DDD的微服务设计实例

文章目录 项目基本信息战略设计战术设计后续的工作 用一个项目来了解 DDD 的战略设计和战术设计,走一遍从领域建模到微服务设计的全过程,一起掌握 DDD 的主要设计流程和关键 点。 项目基本信息 项目的目标是实现在线请假和考勤管理。功能描述如下&…

新材料制造业工厂MES系统解决方案

新材料是指具有优异性能和功能的材料,是国家战略性新兴产业的重要支撑。新材料涵盖了高性能结构材料、先进功能材料、生物医用材料、智能制造材料等多个领域,广泛应用于航空航天、电子信息、节能环保、生物医药等行业,对于提升国家综合实力和…

生成式AI革命对亚马逊的电商业务是威胁还是机遇?

来源:猛兽财经 作者:猛兽财经 总结: (1)当所有人都在关注生成式AI是如何威胁谷歌(GOOG)的搜索业务之际,投资界却忽视了一个事实,即:它也给亚马逊(AMZN)的电商业务带来了威胁。 &…

使用Selenium-PO设计模式提高Web自动化测试效率

PO(page object)设计模式是在自动化中已经流行起来的一种易于维护和减少代码的设计模式。在自动化测试中,PO对象作为一个与页面交互的接口。测试中需要与页面的UI进行交互时,便调用PO的方法。这样做的好处是,如果页面的…

哪吒X选车指南:推荐哪吒X 500lite 版

当下,紧凑型纯电动SUV市场新车不断,可选项越来越多。最近哪吒汽车又上市一款“大气舒适新标杆”——哪吒X,限时权益价10.88万元-12.88万元,以大空间,超舒适,更安全等优势,强势对标AION Y Plus和元Plus等车型。 很多有购车打算的消费者看过价格和配置,直呼哪吒X是“性价比显眼包…

使用Vscode创建一个C_Hello程序

Vscode用来学习C语言语法确实很方便。问题是安装好了,不会用,或编译失败,也是常有的事情,其中一个原因就是不会创建工作区。下面介绍使用Vscode创建一个C语言工作区。有时候看着很简单,时间久了,我竟然忘记…

Mr.Alright---MTK安卓13 抬手亮屏功能的逻辑

该功能在系统设置-显示-拿起设备时唤醒 alps\vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\display\LiftToWakePreferenceController.javapublic boolean isAvailable() {SensorManager sensors (SensorManager) mContext.getSystemServ…

在keil中debug分析单片机数据和函数调用过程(c51为例),使用寄存器组导致错误原因分析

寄存器参考 参考2 [寄存器组使用using参考](https://blog.csdn.net/weixin_46720928/article/details/110221835) keil中的using关键字参考 官方文档里关于using的说明可参阅2个地方,(1)keil软件菜单栏->Help->…

RabbitMQ的五种常见消费模型

目录 引言1. 简单队列模型(Simple Queue Model)优缺点及适用场景代码示例 2. 工作队列模型(Work Queue Model)优缺点及适用场景代码示例 3. 发布/订阅模型(Publish/Subscribe Model)优缺点及适用场景代码示…

python接口自动化测试(单元测试方法)

一、环境搭建 python unittest requests实现http请求的接口自动化Python的优势:语法简洁优美, 功能强大, 标准库跟第三方库灰常强大,建议大家事先了解一下Python的基础;unittest是python的标准测试库,相比于其他测试框架是python目前使用最广…

2 spring 识别自定义实现BeanFactoryPostProcessor 的接口

如果自定义实现了BeanFactoryPostProcessor接口,那么想让spring识别到的话,有两种方式: 1 定义在spring的配置文件中,让spring自动识别 2 调用具体的addBeanFactoryPostProcessor方法 方法1 的代码实现 定义实现BeanFactoryPo…

kibana监控

采取方式 Elastic Agent :更完善的功能 Metricbeat:轻量级指标收集(采用) 传统收集方法:使用内部导出器收集指标,已不建议 安装 metricbeat Download Metricbeat • Ship Metrics to Elasticsearch | E…

JVM——一些零散的概念(后续学习深入了再补充)

Native 凡是带了native关键字的,说明Java的作用范围的达不到了,需要调用底层C语言的库 调用native方法,会进入本地方法栈,调用本地接口(JNI) JNI的作用:扩展Java的使用,融合不同的编程语言为Java所用 它在内…