中间件 封装路由

一、中间件

  1. 中间件是一个特殊的函数,该函数有三个主要的参数 req,res,next

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

  3. 中间件需要按照先后循序执行

  4. 下一个中间件使用上一个中间件的数据,上一个中间件必须 next 调用

  5. 中间件需要使用 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')
})

二、路由

路由是一种对应关系

  1. 后端路由

前端请求的url地址和后端对该地址的处理函数的对应关系

  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('首页')
})

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 };
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容