一、中間件
中間件是一個(gè)特殊的函數(shù)胳泉,該函數(shù)有三個(gè)主要的參數(shù) req,res,next
中間件的req,res是共享
中間件需要按照先后循序執(zhí)行
下一個(gè)中間件使用上一個(gè)中間件的數(shù)據(jù)拧额,上一個(gè)中間件必須 next 調(diào)用
中間件需要使用 use 調(diào)用
中間件的基本使用
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('首頁(yè)')
})
app.get('/about.html', (req, res) => {
res.send('關(guān)于')
})
app.listen(3000, () => {
console.log('http://127.0.0.1:3000')
})
function logMiddleWare(req, res, next) {
let dataStr = `請(qǐng)求類型${req.method}---請(qǐng)求的路徑${req.url}---時(shí)間${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('首頁(yè)')
})
app.get('/about.html', (req, res) => {
res.send('關(guān)于')
})
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 = `請(qǐng)求類型${req.method}---請(qǐng)求的路徑${req.url}---時(shí)間${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()
})
}
由于代碼冗余,可以將其進(jìn)行拆解,分為不同模塊
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 = `請(qǐng)求類型${req.method}---請(qǐng)求的路徑${req.url}---時(shí)間${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表單中傳輸數(shù)據(jù)
后者是用于直接用對(duì)象傳輸數(shù)據(jù)
// 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模塊(其實(shí)是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('首頁(yè)')
})
app.get('/about.html', (req, res) => {
res.send('關(guān)于')
})
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')
})
二、路由
路由是一種對(duì)應(yīng)關(guān)系
- 后端路由
前端請(qǐng)求的url地址和后端對(duì)該地址的處理函數(shù)的對(duì)應(yīng)關(guān)系
- 前端路由
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('首頁(yè)')
})
router.get('/about.html', (req, res) => {
res.send('關(guān)于')
})
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
方式二 構(gòu)造函數(shù)寫法
// module.exports = (express, app) => {
// const router = express.Router()
// router.get('/', (req, res) => {
// res.send('hello express')
// })
// router.get('/index.html', (req, res) => {
// res.send('首頁(yè)')
// })
// router.get('/about.html', (req, res) => {
// res.send('關(guān)于')
// })
// 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寫法
刪除時(shí)不建議使用delete語(yǔ)句,回直接刪除數(shù)據(jù)庫(kù)
可以使用 updata更改是否可用進(jìn)行軟刪除
const mysql = require('mysql')
// 1. 創(chuàng)建連接對(duì)象
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('數(shù)據(jù)庫(kù)連接開啟成功')
// })
// 3. 數(shù)據(jù)的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. 關(guān)閉連接
connection.end(err => {
if (err) return console.log(err.message)
console.log('關(guān)閉數(shù)據(jù)庫(kù)連接')
})
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("數(shù)據(jù)庫(kù)連接失敗:" + err.message);
reject(err.message);
}
conn.query(sql, params, function (err, result) {
if (err) {
console.log("執(zhí)行sql語(yǔ)句失敗:" + err.message);
reject(err.message);
}
reoslve(result);
conn.release();
})
})
})
}
module.exports = { exec };