一、中间件
中间件是一个特殊的函数,该函数有三个主要的参数 req,res,next
中间件的req,res是共享
中间件需要按照先后循序执行
下一个中间件使用上一个中间件的数据,上一个中间件必须 next 调用
中间件需要使用 use 调用
中间件的基本使用
const express = require('express')
const path = require('path')
const app = express()
app.use(middleWare)
app.get('/', (req, res) => {
console.log(req.body)
res.send('hello express')
})
app.listen(3000, () => {
console.log('http://127.0.0.1:3000')
})
function middleWare(req, res, next) {
req.body = {
name: 'fly'
}
next()
}
中间件的举例 获取日志
const express = require('express')
const path = require('path')
const fs = require('fs')
const app = express()
app.use(logMiddleWare)
app.get('/', (req, res) => {
res.send('hello express')
})
app.get('/index.html', (req, res) => {
res.send('首页')
})
app.get('/about.html', (req, res) => {
res.send('关于')
})
app.listen(3000, () => {
console.log('http://127.0.0.1:3000')
})
function logMiddleWare(req, res, next) {
let dataStr = `请求类型${req.method}---请求的路径${req.url}---时间${new Date}\n`
fs.appendFile(path.join(__dirname, './log.txt'), dataStr, err => {
if (err) return console.log(err.message)
console.log('日志记录成功')
next()
})
}
增加表单解析
app.get('/index.html', (req, res) => {
res.send('首页')
})
app.get('/about.html', (req, res) => {
res.send('关于')
})
app.post('/api/post', (req, res) => {
console.log(req.body)
res.send('post')
})
app.post('/api/about', (req, res) => {
// {
// name: 'fly',
// age: 18
// }
console.log(req.body)
res.send('about')
})
app.listen(3000, () => {
console.log('http://127.0.0.1:3000')
})
function logMiddleWare(req, res, next) {
let dataStr = `请求类型${req.method}---请求的路径${req.url}---时间${new Date}\n`
fs.appendFile(path.join(__dirname, './log.txt'), dataStr, err => {
if (err) return console.log(err.message)
console.log('日志记录成功')
next()
})
}
function bodyParse(req, res, next) {
// name=fly&age=18
let dataStr = ''
req.on('data', chunk => {
dataStr += chunk
})
req.on('end', () => {
req.body = querystring.parse(dataStr)
next()
})
}
由于代码冗余,可以将其进行拆解,分为不同模块
const querystring = require('querystring')
module.exports = (req, res, next) => {
let dataStr = ''
req.on('data', chunk => {
dataStr += chunk
})
req.on('end', () => {
req.body = querystring.parse(dataStr)
next()
})
}
const path = require('path')
const fs = require('fs')
module.exports = (req, res, next) => {
let dataStr = `请求类型${req.method}---请求的路径${req.url}---时间${new Date}\n`
fs.appendFile(path.join(__dirname, '../log.txt'), dataStr, err => {
if (err) return console.log(err.message)
console.log('日志记录成功')
next()
})
}
const express = require('express')
const app = express()
方式一 直接引入自己封装的模块
const logMiddleWare = require('./middleware/logMiddleware')
app.use(logMiddleWare)
// const bodyParser = require('./middleware/bodyParser')
// app.use(bodyParser)
方式二 引入bodyParser模块
前者是用于form表单中传输数据
后者是用于直接用对象传输数据
// const bodyParser = require('body-parser')
// parse application/x-www-form-urlencoded
// app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
// app.use(bodyParser.json())
方式三 直接使用express模块(其实是express中纳入bodyParser模块)
// parse application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: false }))
// parse application/json
app.use(express.json())
app.get('/', (req, res) => {
res.send('hello express')
})
app.get('/index.html', (req, res) => {
res.send('首页')
})
app.get('/about.html', (req, res) => {
res.send('关于')
})
app.post('/api/post', (req, res) => {
console.log(req.body)
res.send('post')
})
app.post('/api/about', (req, res) => {
console.log(req.body)
res.send('about')
})
app.listen(3000, () => {
console.log('http://127.0.0.1:3000')
})
二、路由
路由是一种对应关系
- 后端路由
前端请求的url地址和后端对该地址的处理函数的对应关系
- 前端路由
const express = require('express')
const app = express()
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
const router = require('./router')
app.use(router)
// require('./router/index.js')(express, app)
app.listen(3000, () => {
console.log('http://127.0.0.1:3000')
})
router 文件下的index.js文件
方式一 官方推荐写法
const express = require('express')
const router = express.Router()
router.get('/', (req, res) => {
console.log(req.query.name)
console.log(req.query.age)
res.send('hello express')
})
router.get('/:name/:age', (req, res) => {
console.log(req.params.name)
console.log(req.params.age)
res.send('hello express')
})
router.get('/index.html', (req, res) => {
res.send('首页')
})
router.get('/about.html', (req, res) => {
res.send('关于')
})
router.post('/api/post', (req, res) => {
console.log(req.body)
res.send('post')
})
router.post('/api/about', (req, res) => {
console.log(req.body)
res.send('about')
})
module.exports = router
方式二 构造函数写法
// module.exports = (express, app) => {
// const router = express.Router()
// router.get('/', (req, res) => {
// res.send('hello express')
// })
// router.get('/index.html', (req, res) => {
// res.send('首页')
// })
// router.get('/about.html', (req, res) => {
// res.send('关于')
// })
// router.post('/api/post', (req, res) => {
// console.log(req.body)
// res.send('post')
// })
// router.post('/api/about', (req, res) => {
// console.log(req.body)
// res.send('about')
// })
// app.use(router)
// }
mysql写法
删除时不建议使用delete语句,回直接删除数据库
可以使用 updata更改是否可用进行软删除
const mysql = require('mysql')
// 1. 创建连接对象
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'hero'
})
// 2. 开启连接
// connection.connect(err => {
// if (err) return console.log(err.message)
// console.log('数据库连接开启成功')
// })
// 3. 数据的CRUD
const sql = 'select * from hero where isdel = 0'
// const sql = 'insert into hero set ?'
// const body = {
// name: '王昭君',
// age: 16,
// ctime: '2021-09-02 11:34:44'
// }
// const sql = `insert into hero (name,age,ctime) values ('鲁班','18','2021-09-02 11:36:44')`
// const sql = 'update hero set ? where id = ?'
// const body = {
// name: '东皇',
// age: 16,
// ctime: '2021-09-02 11:34:44'
// }
// const sql = 'update hero set isdel = 1 where id = ?'
// connection.query(sql,params,callback)
connection.query(sql, (err, results) => {
if (err) return console.log(err.message)
console.log(results)
})
// 4. 关闭连接
connection.end(err => {
if (err) return console.log(err.message)
console.log('关闭数据库连接')
})
mysql的封装
const mysql = require("mysql");
const pool = mysql.createPool({
host: '127.0.0.1',
user: 'root',
password: 'root',
database: 'cs2104'
})
const exec = (sql, params = []) => {
return new Promise((reoslve, reject) => {
pool.getConnection(function (err, conn) {
if (err) {
console.log("数据库连接失败:" + err.message);
reject(err.message);
}
conn.query(sql, params, function (err, result) {
if (err) {
console.log("执行sql语句失败:" + err.message);
reject(err.message);
}
reoslve(result);
conn.release();
})
})
})
}
module.exports = { exec };