目录
前言
创建服务器
编写注册接口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