前端、后台、数据库 - 图1

Express中间件(Middleware)

中间件的本质就是一个请求处理方法,我们把用户从请求到响应的整个过程分发到多个中间件去处理,这样做的目的是为了提高代码灵活性,动态可拓展。

  • 中间件默认接收三个参数 function (req, res, next){}
    • req 请求对象
    • res 响应对象
    • next 调用下一个中间件的方法
  • 当一个请求进来,会从第一个中间件开始匹配,如果匹配则会进入中间件,不匹配则会去找下一个中间件匹配
  • 当一个请求进入一个中间件之后,如果不调用 next 方法则会停留在当前中间件
  • 如果调用next方法时传递了参数,则会直接往最后面找到有四个参数的应用程序级别的中间件,通常是传入err错误对象,抛出错误给专门处理错误的中间件处理
  1. app.get('/a', function (req, res, next) {
  2. fs.readFile('./adadada/', function (err, data) {
  3. if (err) {
  4. next(err)
  5. }
  6. })
  7. })
  8. ....
  9. // 配置错误处理的中间件
  10. app.use(function (err, req, res, next) {
  11. res.status(500).send(err.message)
  12. })

前端发送ajax异步请求的过程发生了什么?

  1. 前端发送ajax请求
  1. // 前端ajax异步请求(axios封装)
  2. async fetch() {
  3. await this.$http.post('http://localhost:3000/admin/api/categories', this.model)
  4. }
  1. 后端接收请求
    • express.Router
      • 使用express.Router类来创建可安装的模块化路由处理程序,Router实例const route = express.Router()是完整的中间件和路由系统
    • app.use()
      • express使用中间件(function),可选参数path 的默认路径为 “/“ ```javascript const express = require(‘express’) const app = express() const router = express.Router()

router.post(‘categories’)

app.use(‘/admin/api’, router) // 服务端监听3000端口 app.listen(3000)

  1. 3. 服务端处理数据库
  2. - 连接数据库
  3. ```javascript
  4. // 小技巧 导出一个函数,然后在入口文件(index.js)加括号传入app参数直接调用
  5. module.exports = app => {
  6. const mongoose = require('mongoose')
  7. // 指定连接的数据库不要求一定是已存在的,不存在会自动帮你创建好
  8. mongoose.connect('mongodb://127.0.0.1:27017/node-vue-moba', {
  9. useNewUrlParser: true
  10. })
  11. }
  12. // 在node执行的入口文件导入后执行
  13. require('../../db.js')(app)
  • 创建数据模型

    1. const mongoose = require('mongoose')
    2. const schema = new mongoose.Schema({
    3. name: {
    4. type: String
    5. }
    6. })
    7. // 导出 Categoty 模型
    8. module.exports = mongoose.model('Category', schema)
  • 根据用户行为操作数据模型

    1. // 小技巧 导出一个函数,然后在入口文件(index.js)加括号传入app参数直接调用
    2. module.exports = app => {
    3. const express = require('express')
    4. // express子路由
    5. const router = express.Router()
    6. // 导入Category数据模型
    7. const Category = require('../../models/Category')
    8. // 添加请求路由方法
    9. // 分类接口
    10. router.post('/categories', async (req, res) => {
    11. const model = await Category.create(req.body)
    12. res.send(model)
    13. console.log(req)
    14. })
    15. // 子路由挂载
    16. app.use('/admin/api', router)
    17. }

image.png

image.png