入口文件
//根目录下入口文件
//导入express模块
const express = require('express')
//创建实例
const app = express()
const joi = require('joi')
//引入cors中间件 配置为全局中间件 支持跨域
const cors = require('cors')
app.use(cors())
//引入配置解析 `application/x-www-form-urlencoded` 格式的表单数据的中间件
//express的内置中间件
app.use(express.urlencoded({ extended: false }))
//为了简化res.send()代码 封装一个函数 声明一个中间件 在之后的路由中使用
app.use((req, res, next) => {
//定义函数
res.cc = (err,status=1) => {
res.send({
status,
message:err instanceof Error ? err.message:err
})
}
next()
})
//导入并注册路由模块
const userRouter = require('./router/user')
app.use('/api', userRouter)//api为访问前缀
//定义错误级别的中间件
app.use(function (err, req, res, next) {
// 数据验证失败
if (err instanceof joi.ValidationError) return res.cc(err)
// 未知错误
res.cc(err)
})
//监听启动
app.listen(3007, () => {
console.log('api server running at http://127.0.0.1:3007')
})
路由
//只存放客户端请求与处理函数之间的关系
//引入express
const express=require('express')
//创建路由对象
const router = express.Router()
//导入router_handler中的user.js
const userHandler = require('../router_handler/user.js')
//导入验证数据的中间件
const expressJoi = require('@escook/express-joi')
//导入需要验证的规则对象
const {text}=require('../schema/user.js')
//注册新用户 使用这个中间件
router.post('/reguser',expressJoi(text),userHandler.regUser )
//登录
router.post('/login',userHandler.login )
//路由对象共享
module.exports = router
路由函数
//抽离用户路由模块中的处理函数
//导入数据库模块
const db = require('../db/index.js')
//导入bcryptjs模块
const bcrypt=require('bcryptjs')
//注册模块
exports.regUser = (req, res) => {
//1.检测表单是否合法
//接收表单数据
const userinfo = req.body
//判断数据是否合法
// if (!userinfo.username || !userinfo.password) {
// return res.send({
// status: 1,
// message:'用户名或者密码不能为空'
// })
// }
//2.监测用户名是否被占用 需要导入数据库模块
const sql1 = 'select * from ev_users where username=?'
db.query(sql1, userinfo.username, (err,results) => {
if (err) {
// return res.send({status:1 ,message:err.message})
return res.cc(err)
}
if (results.length > 0) { //查询返回的是数组 如果数组里有数据 长度大于零 说明用户已存在
// return res.send({status:1, message:'用户名已存在 请更换'})
return res.cc('用户名已存在 请更换')
}
//给符合要求的用户密码加密
userinfo.password = bcrypt.hashSync(userinfo.password, 10)
//插入注册的新用户信息
const sql2 = 'insert into ev_users set ?'
db.query(sql2, { username: userinfo.username, password: userinfo.password }, (err, results) => {
if (err) {
// return res.send({status:1 ,message:err.message})
return res.cc(err)
}
//语句执行成功但是影响行数不唯一 也是失败
if (results.affectedRows !== 1) {
// return res.send({status:1, message:'注册用户失败 稍后再试'})
return res.cc('注册用户失败 稍后再试')
}
//注册成功
// res.send({ status: 0, message: '注册成功' })
res.cc('注册成功',0)
})
})
}
//登录模块
exports.login = (req,res) => {
res.send('login ok')
}
与数据库联系
//导入mysql模块
const mysql = require('mysql')
//与数据库联系
const db = mysql.createPool({
host: '127.0.0.1',
user: 'root',
password: 'admin123',
database:'my_db_01'
})
//暴露
module.exports = db
验证规则
//优化表单数据验证
//用户信息验证规则模块
const joi = require('joi')
//用户名验证规则
const username = joi.string().alphanum().min(1).max(10).required()
//密码验证规则
const password = joi.string().pattern(/^[\S]{6,12}$/).required() //非空字符6-12位
//暴露验证规则
exports.text = {
body: { //验证表单数据req.body上的username password
username,
password
},
}