创建express文件夹
初始化项目文档
npm init -y
导入express
npm insatll express
创建项目入口文件app.js
const express = require('express')
const app=express()
app.listen(8081,()=>{
console.log('端口运行在8081');
})
npm i mysql
创建db文件夹添加mysql.js作为sql配置文件
const mysql = require('mysql')
const db = mysql.createPool({
host: '127.0.0.1',//本机ip地址相当于localhost
user: 'root',
password: '123123',
database: 'new_schema'
})//创建数据库连接实例
module.exports = db//向外暴露作为全局共享
创建路由文件夹,以功能名命名js文件xxx.js
const express=require('express')//导入express
const router=express.Router()//创建路由实例
// 导入handler数据处理回调函数
const {cha}=require('../router_handler/article_handler')
//配置接口路径和请求方式
router.get('/midsen',验证规则,cha)
//向外暴露路由给app.js引入
module.exports = router
创建路由处理回调函数文件夹,以handler命名法,作为对应路由的数据处理文件
//导入数据库连接实例
const db = require('../db/mysql')
exports.cha = (req, res) => {
res.send('ok')
}
导入nodemon保存自动重启
npm i nodemon --save-dev
启动服务
nodemon app.js
在浏览器中8081端口添加/article/midsen
下面就可以通过req.query/req.body来拿到从用户端传过来的请求数据,db.query操作数据库通过res.send,把数据传回客户端
// 定义查询用户信息的sql语句
const selSql = 'select id,username,user_pic,nickname from ev_users where id=?'
db.query(selSql, req.auth.id, (err, result) => {
if (err) return res.cc(err.sqlMessage)
if (result.length !== 1) return res.cc('获取信息失败')
res.send({
status: 0,
message: '获取信息成功',
data: result[0]
})
})
res.send({
status: 0,
message: '成功',
data:
})
回传数据
定义全局中间件错误处理函数
// 注册全局中间件用来简化send捕获错误发送提示信息
app.use((req, res, next) => {
res.cc = function(err, status = 1) {
res.send({
status,
message: err instanceof Error ? err.message : err
})
}
next()
})
定义数据验证规则,用于验证用户发送数据是否合法
const joi = require('joi')//npm i joi/express-joi --save-dev
const title = joi.string().min(1).max(30).required()
const cate_id = joi.number().integer().min(1).required()
const content = joi.string().min(1).max(255).required()
const cover_img = joi.string().dataUri().required()
const state = joi.string().pattern(/[发布]|[草稿]/).required()
module.exports.add_atricle_schema = {
body: {
title,
cate_id,
content,
cover_img,
state
}
}
定义全局中间件错误验证处理中间件
// 定义错误级别全局中间件处理表单验证失败的错误
app.use((err, req, res, next) => {
// 数据验证失败
if (err instanceof Joi.ValidationError) return res.cc(err)
//
if (err.name === 'UnauthorizedError') return res.cc("身份认证失败")
// 数据验证未知错误
res.cc(err)
})
引入全局处理中间件和验证规则解构
// 导入表单验证表单数据中间件
const expressJoi = require('@escook/express-joi')
// 导入验证规则对象
const { reg_login_schema } = require('../schema/user')
// 注册新用户
// expressJoi(reg_login_schema)声明局部中间件,对当前请求中携带的数据进行验证
// 验证通过,数据流转给后面的路由处理函数
// 验证失败,终止后续代码,抛出Error,进入全局错误中间件进行处理
router.post('/reguser', expressJoi(reg_login_schema), handler.regUser)
// 登录
router.post('/login', expressJoi(reg_login_schema), handler.loGin)
module.exports = router
添加用户登录token密钥
// 设置加密字符串
const bcry = require('bcryptjs')
// 设置用户加密Token
const jsonScr = require('jsonwebtoken')
// 设置token密钥和生效事件保存在config文件中
const scritKey = require('../Config')
// 给密码设置成加密字符再重新赋值给user
user.password = bcry.hashSync(user.password, 10)
token密钥规则
module.exports = {
// token密钥
jwtScecret: 'mmws ^^',
// 有效期
expiresIn: '10H'
}
获取用户信息时验证密钥身份
const compare = bcry.compareSync(req.body.oldPwd, result[0].password)
if (!compare) return res.cc("旧密码不正确")
res.cc是全局res.send中间件
简单示例代码,用于创建简单的express服务器供学习使用