• Node编写用户注册接口


    目录

    前言

    创建服务器

    编写注册接口API

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

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

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

    验证表单数据

    在数据库中创建表

    在node中绑定mysql数据库

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

    密码加密

    完整代码


    前言

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

    创建服务器

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

    express

    npm i express

    cors跨域模块

    npm i cors

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

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

    创建服务器完整代码

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

    然后启动服务器

    编写注册接口API

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

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

    在发起请求时,多一个api

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

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

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

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

    验证表单数据

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

    安装自定义验证规则的包

    npm i joi

    导包

    const joi = require('joi')

    自定义验证规则

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

    定义验证规则对象

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

    实现对表单自动验证功能

    安装

    npm i @escook/express-joi

    导入

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

    在请求中验证

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

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

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

    使用postman模拟发起注册请求

    在数据库中创建表

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

    创建好表

    在node中绑定mysql数据库

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

    单独创建一个文件存放mysql

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

    1. // 导入 mysql 模块
    2. const mysql = require('mysql')
    3. // 创建数据库连接对象
    4. const db = mysql.createPool({
    5. host: '127.0.0.1',
    6. user: 'root',
    7. password: 'qpalzm123',
    8. database: 'my_db_01',
    9. })
    10. // 向外共享 db 数据库连接对象
    11. module.exports = db

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

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

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

    使用postman发送请求验证

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

    当输入新的账号时

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

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

    注册成功

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

    再次提交相同的账号

    密码加密

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

    使用bcryptjs进行加密

    安装

    npm i bcryptjs

    导入模块

    const bcrypt = require('bcryptjs')

    bcryptjs使用

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

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

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

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

    在数据库中

    密码被成功加密

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

    完整代码

    注册接口完整代码

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

    1. // 导入express模块
    2. const express = require('express')
    3. // 导入数据库对象
    4. const db = require('../db/index')
    5. // 导入加密模块
    6. const bcrypt = require('bcryptjs')
    7. // 创建路由对象
    8. const router = express.Router()
    9. router.post('/reguser',(req,res)=>{
    10. const userinfo = req.body
    11. if(!userinfo.username||!userinfo.password){
    12. return res.send({
    13. status:1,
    14. message:'请输入正确的账号和密码'
    15. })
    16. }
    17. // 定义sql语句
    18. const sql = 'select * from ev_users where username=?'
    19. db.query(sql,userinfo.username,(err,results)=>{
    20. // 执行sql语句失败
    21. if(err){
    22. return res.send({
    23. status:1,
    24. message:err.message
    25. })
    26. }
    27. // 用户名被占用
    28. if (results.length > 0) {
    29. return res.send({ status: 1, message: '用户名被占用,请更换其他用户名!' })
    30. }
    31. // 密码加密
    32. userinfo.password=bcrypt.hashSync(userinfo.password,10)
    33. // 插入新用户
    34. const sql = 'insert into ev_users set ?'
    35. db.query(sql, { username: userinfo.username, password: userinfo.password }, function (err, results) {
    36. // 执行 SQL 语句失败
    37. if (err) return res.send({ status: 1, message: err.message })
    38. // SQL 语句执行成功,但影响行数不为 1
    39. if (results.affectedRows !== 1) {
    40. return res.send({ status: 1, message: '注册用户失败,请稍后再试!' })
    41. }
    42. // 注册成功
    43. res.send({ status: 0, message: '注册成功!' })
    44. })
    45. })
    46. })
    47. module.exports=router

  • 相关阅读:
    Netty(8)netty组件:ByteBuf
    【高频】如何保证缓存和数据库一致
    gma 2 教程(二)数据操作:7.矢量数据操作简介
    CAR_CTS应用的命令
    Jitpack发布Android库带文档和源码
    grid的使用
    取消task异步任务
    方法引用知识点
    【华为机试真题 JAVA】整型数组按个位值排序-100
    企业如何低成本建立工业互联网平台?
  • 原文地址:https://blog.csdn.net/weixin_68854196/article/details/133992253