Node编写用户注册接口

news2024/11/16 1:25:59

目录

前言

创建服务器

编写注册接口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.body
        if(!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 语句执行成功,但影响行数不为 1
            if (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.body
        if(!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 语句执行成功,但影响行数不为 1
            if (results.affectedRows !== 1) {
              return res.send({ status: 1, message: '注册用户失败,请稍后再试!' })
            }
            // 注册成功
            res.send({ status: 0, message: '注册成功!' })
          })
        })
})

module.exports=router

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

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

相关文章

Redis详细安装教程

一、Redis 的安装及启动停止 1-1 下载 redis的压缩包 wget https://download.redis.io/releases/redis-5.0.14.tar.gz1-2 开始解压 redis tar -zxvf redis-5.0.14.tar.gz1-3 执行 make 命令编译 make PREFIX/usr/redis install (如果不加prefix 默认安装到/usr/…

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters2. 解决参考 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters …

【API篇】六、Flink输出算子Sink

文章目录 1、输出到外部系统2、输出到文件3、输出到KafKa4、输出到MySQL(JDBC)5、自定义Sink输出 Flink做为数据处理引擎,要把最终处理好的数据写入外部存储,为外部系统或应用提供支持。与输入算子Source相对应的,输出…

docker部署rabbitmq的坑

背景 今天用docker部署rabbitmq,启动都一起正常,但是当访问15672端口时,不能加载出页面。 排查 1.防火墙是否开启 ufw status2.ip是否能ping通 ping 192.168.x.x3.检查docker日志 docker psdocker logs -f 容器id4.进入容器&#xff0c…

Visual Studio Code (VS Code)安装教程

Visual Studio Code(简称“VS Code”)。 1.下载安装包 VS Code的官网: Visual Studio Code - Code Editing. Redefined 首先提及一下,vscode是不需要破解操作的; 第一步,看好版本,由于我的系…

性能测试连载-负载场景模型构建

业务需求 假设公司领导现在给你分配了一个性能测试需求如下: 1:公司有1000人在上班时间段会登录平台进行打卡操作,可能会登录打卡多次 2:业务高峰时间段在8:00-8:30,半小时 3:需要保证90%用户的响应时间在…

GB28181学习(十二)——报警事件通知和分发

要求 发生报警事件时,源设备将报警信息发送给SIP服务器;报警事件通知和分发使用MESSAGE方法;源设备包括: SIP设备网关SIP客户端联网系统综合接处警系统以及卡口系统 目标设备包括: 具有接警功能的SIP客户端联网系统综…

【斗破年番】官方终于回应,萧潇删减不属实,两线索佐证,彩鳞咖位不会降

【侵权联系删除】【文/郑尔巴金】 斗破苍穹年番动画虽然火爆,但是问题也很多,动不动就上演一出魔改,引发粉丝们的疯狂吐槽。先是萧炎与美杜莎女王的陨落心炎失身戏份遭删减,如今当萧炎回蛇人族,又魔改了美杜莎女王怀孕…

06、Python 序列 与 列表 与 元组 的关系和创建 和 简单使用

目录 序列元组与列表关系总结 创建元组与列表方式一创建元组注意点 创建元组与列表方式二简单使用通过索引访问元素子序列序列加法序列乘法in运算 了解Python序列 创建列表和元组 通过索引访问元素 子序列 序列运算 序列 所谓序列,指的是一种包含多项数据的数据结…

【面试经典150 | 链表】循环链表

文章目录 Tag题目来源题目解读解题思路方法一:哈希集合方法二:快慢指针方法三:计数 拓展其他语言python3 写在最后 Tag 【快慢指针】【哈希集合】【计数】【链表】 题目来源 141. 环形链表 题目解读 判断一个链表中是否存在环。 解题思路 …

vue2中,下拉框多选和全选的实现

vue2中&#xff0c;下拉框多选和全选的实现 代码布局在methods: 中添加功能函数较为完整的一个整体代码&#xff1a; 如图所示点击全选即可完成下拉框中全部子项的全部的选中&#xff0c;同时取消全选即可全部取消选择。 代码布局 <div class"chos-box2"><…

STM32入门F4

学习资料&#xff1a;杨桃电子&#xff0c;官网&#xff1a;洋桃电子 | 杜洋工作室 www.doyoung.net 嵌入式开发核心宗旨&#xff1a;以最适合的性能、功能、成本来完成最有性价比的产品开发。 1.为什么要学F407 STM32F103系列与STM32F407系列对照表&#xff1a; 2.F4系列命…

Ruo-Yi前后端分离版本相关笔记

1.前提条件和基础 Spring Boot Vue 环境要求&#xff1a;Jdk1.8以上版本、MySql数据库、Redis、Maven、Vue 2.使用若依 官网地址&#xff1a;RuoYi-Vue: &#x1f389; 基于SpringBoot&#xff0c;Spring Security&#xff0c;JWT&#xff0c;Vue & Element 的前后端分…

渗透测试tomcat错误信息泄露解决办法

解决方法&#xff1a; 1、使用tomcat8.5.16&#xff0c;会重定向非法url到登录url 2、配置server.xml&#xff0c;加上 <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" />配置…

Unity中国、Cocos为OpenHarmony游戏生态插上腾飞的翅膀

2023年是OpenHarmony游戏生态百花齐放的一年&#xff01;为了扩展OpenHarmony游戏生态&#xff0c;OpenHarmony在基金会成立了游戏SIG小组&#xff0c;游戏SIG小组联合cocos&#xff0c;从cocos2dx入手一周内快速适配了cocos2.2.6的MVP版本&#xff0c;随后又分别适配了cocos2d…

扬尘在线监测 扬尘在线监测系统 扬尘监测设备

计讯物联扬尘在线监测系统&#xff0c;环保数采仪云管理平台&#xff0c;PM2.5、PM10、TSP、温度、湿度、噪声、大气压力、风力、风速、风向监测目标数据采集&#xff0c;5G/4G无线网络自动上报云端&#xff0c;相关部门实时远程在线监控&#xff0c;同时支持治污喷淋系统、视频…

msvcr100.dll丢失怎样修复,msvcr100.dll丢失怎么解决(最新方法分享)

我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcr100.dll丢失”。这个错误通常会导致某些程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复丢失的msvcr100.dll文件。本文将介绍五个有效的解决方法&#xff0c;帮助大家解决这一问题。 一…

OKLink携手CertiK在港举办Web3生态安全主题论坛

2023年10月23日&#xff0c;OKLink与CertiK共同发起的Web3生态安全主题论坛在香港铜锣湾拉开帷幕。本次论坛由OKLink和CertiK主办&#xff0c;香港投资推广署独家支持&#xff0c;聚焦如何构建安全可靠的Web3生态系统议题&#xff0c;同时深入剖析这一进程中所面临的潜在挑战。…

Qt中QFile、QByteArray QDataStream和QTextStream区别及示例

在Qt中&#xff0c;QFile、QByteArray、QDataStream和QTextStream是常用的文件和数据处理类。 主要功能和区别 QFile&#xff1a; QFile是用于读写文本和二进制文件以及资源的I/O设备。可以单独使用QFile&#xff0c;或者更方便地与QTextStream或QDataStream一起使用。 通常在…

开关电源检测的技术标准和安全标准是什么?纳米软件为您介绍

开关电源总体技术标准 1. 外观&#xff1a;元器件排列整齐、美观、结构合理&#xff0c;焊点均匀饱满、明亮、光滑、无尖刺&#xff0c;焊接牢固。PCB板铜条无脱落、外露、无毛刺、飞边、变形。 2. 输入电压&#xff1a;110VAC/DC或220VAC/DC或380VAC三相20%;或85~264VAC全范围…