# Express 创建本地服务器

# 创建 express 文件夹
# 初始化项目文档

1
npm insatll express

# 创建项目入口文件 app.js

1
2
3
4
5
6
7
8
9
const express = require('express')
const app=express()




app.listen(8081,()=>{
console.log('端口运行在8081');
})

1
npm i mysql

# 创建 db 文件夹添加 mysql.js 作为 sql 配置文件

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
8
9
10
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 命名法,作为对应路由的数据处理文件

1
2
3
4
5
6
//导入数据库连接实例
const db = require('../db/mysql')

exports.cha = (req, res) => {
res.send('ok')
}

# 导入 nodemon 保存自动重启

1
npm i nodemon --save-dev

# 启动服务

1
nodemon app.js

在浏览器中 8081 端口添加 /article/midsen:

1
ok

# 下面就可以通过 req.query/req.body 来拿到从用户端传过来的请求数据,db.query 操作数据库通过 res.send,把数据传回客户端

1
2
3
4
5
6
7
8
9
10
11
// 定义查询用户信息的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]
})
})

回传数据

定义全局中间件错误处理函数

1
2
3
4
5
6
7
8
9
10
    // 注册全局中间件用来简化send捕获错误发送提示信息
app.use((req, res, next) => {
res.cc = function(err, status = 1) {
res.send({
status,
message: err instanceof Error ? err.message : err
})
}
next()
})

# 定义数据验证规则,用于验证用户发送数据是否合法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
}
}

# 定义全局中间件错误验证处理中间件

1
2
3
4
5
6
7
8
9
 // 定义错误级别全局中间件处理表单验证失败的错误
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)
})

# 引入全局处理中间件和验证规则解构

1
2
3
4
5
6
7
8
9
10
11
12
    // 导入表单验证表单数据中间件
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 密钥

1
2
3
4
5
6
7
8
9
10
11
    // 设置加密字符串
const bcry = require('bcryptjs')
// 设置用户加密Token
const jsonScr = require('jsonwebtoken')
// 设置token密钥和生效事件保存在config文件中
const scritKey = require('../Config')



// 给密码设置成加密字符再重新赋值给user
user.password = bcry.hashSync(user.password, 10)

# token 密钥规则

1
2
3
4
5
6
module.exports = {
// token密钥
jwtScecret: 'mmws ^^',
// 有效期
expiresIn: '10H'
}

# 获取用户信息时验证密钥身份

1
2
const compare = bcry.compareSync(req.body.oldPwd, result[0].password)
if (!compare) return res.cc("旧密码不正确")

res.cc 是全局 res.send 中间件

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Xiao Yang Guo 微信支付

微信支付

Xiao Yang Guo 支付宝

支付宝

Xiao Yang Guo 贝宝

贝宝