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