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模拟发送请求,验证接口是否能用

Node编写用户注册接口_第1张图片

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

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

Node编写用户注册接口_第2张图片

验证表单数据

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

安装自定义验证规则的包

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模拟发起注册请求

Node编写用户注册接口_第3张图片

在数据库中创建表

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

创建好表

Node编写用户注册接口_第4张图片

在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('注册成功')
        })

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

Node编写用户注册接口_第5张图片

使用postman发送请求验证

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

Node编写用户注册接口_第6张图片

当输入新的账号时

Node编写用户注册接口_第7张图片

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

// 插入新用户
        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: '注册成功!' })
          })

注册成功

Node编写用户注册接口_第8张图片

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

Node编写用户注册接口_第9张图片

再次提交相同的账号

Node编写用户注册接口_第10张图片

密码加密

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

使用bcryptjs进行加密

安装

npm i bcryptjs

导入模块

const bcrypt = require('bcryptjs')

bcryptjs使用

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

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

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

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

Node编写用户注册接口_第11张图片

在数据库中

Node编写用户注册接口_第12张图片

密码被成功加密

这样注册接口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

你可能感兴趣的:(node.js)