中間件 封裝路由

一、中間件

  1. 中間件是一個(gè)特殊的函數(shù)胳泉,該函數(shù)有三個(gè)主要的參數(shù) req,res,next

  2. 中間件的req,res是共享

  3. 中間件需要按照先后循序執(zhí)行

  4. 下一個(gè)中間件使用上一個(gè)中間件的數(shù)據(jù)拧额,上一個(gè)中間件必須 next 調(diào)用

  5. 中間件需要使用 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)系

  1. 后端路由

前端請(qǐng)求的url地址和后端對(duì)該地址的處理函數(shù)的對(duì)應(yīng)關(guān)系

  1. 前端路由
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 };
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舒憾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌穗熬,老刑警劉巖镀迂,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異唤蔗,居然都是意外死亡探遵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門妓柜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箱季,“玉大人,你說我怎么就攤上這事棍掐〔爻” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵作煌,是天一觀的道長(zhǎng)掘殴。 經(jīng)常有香客問我赚瘦,道長(zhǎng),這世上最難降的妖魔是什么奏寨? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任起意,我火速辦了婚禮,結(jié)果婚禮上服爷,老公的妹妹穿的比我還像新娘杜恰。我一直安慰自己,他們只是感情好仍源,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布心褐。 她就那樣靜靜地躺著,像睡著了一般笼踩。 火紅的嫁衣襯著肌膚如雪逗爹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天嚎于,我揣著相機(jī)與錄音掘而,去河邊找鬼。 笑死于购,一個(gè)胖子當(dāng)著我的面吹牛袍睡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肋僧,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼斑胜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嫌吠?” 一聲冷哼從身側(cè)響起止潘,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辫诅,沒想到半個(gè)月后凭戴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炕矮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年么夫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肤视。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡魏割,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钢颂,到底是詐尸還是另有隱情钞它,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站遭垛,受9級(jí)特大地震影響尼桶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锯仪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一泵督、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庶喜,春花似錦小腊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至斥扛,卻和暖如春入问,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稀颁。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工芬失, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匾灶。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓棱烂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親阶女。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颊糜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容