移动端农机商城项目后端开发笔记

开发笔记

  • 项目前端文档点此

  • 模块化规范遵循 : commonJs

  • 前后端通信处理跨域问题使用插件 koa2-cors

    • credentials: true是为了能够在后端代码中接受cookie , 否则由于cors的安全性原因后端无法接受cookie , 进而导致session失效
    • 注意: 本项目并未使用cookie-session

路由

  • 使用 koa-router

  • 配置路由前缀 prefix ( 用于多级导航规划 )

      // before : https://localhost:3000/login/
      // after : https://localhost:3000/prefix/login/
      new Router({
        prefix: '/prefix'
      })
    

数据存储方案

  • 数据库选型: MongoDB

  • 数据建模 & 操作数据库: Mongoose

  • 加载所有数据模型 使用插件 glob

  • 图形化管理工具 Robo 3T

密码加盐加密

  • 使用插件 bcryptjs

  • 在本项目中的实现方式: 基于Promise处理异步

  • 其它实现方式 ( 使用mongoose的钩子函数 userSchema.pre(‘save’, callback(next)) )

      const bcrypt = require('bcrypt)
    
      userSchema.pre('save', function (next) {
        bcrypt.genSalt(10, (err, salt) => {
          if (err) return next(err)
          bcrypt.hash(this.passWord, salt, (err, hash) => {
            if (err) return next(err)
            this.passWord = hash
            next()
          })
        })
      })
    

商品分类功能 ( 数据库中维护两个集合,类似于外键 )

  • 商品类别集合 types 中的每一条数据维护两个字段 typeId & typeName

  • 商品信息集合 products 中的每一条数据除维护商品具体信息外 , 维护着 typeId 字段

  • 多集合关联查询

      // /model/Cart.js
      const cartSchema = new Schema({
        productId: {
          ref: 'Product' // 指向联合查询的model
        }
      })
      mongoose.model('Cart', cartSchema);
    
      // /controller/cart.js
      const Cart = mongoose.model('Cart');
      await Cart.find({ userId: ctx.query.userId }).populate('productId').exec()
    

知识点总结

  • get 请求,接收参数

    • ctx.query / ctx.queryString

      • query 返回的是格式化好的参数对象

      • queryString 返回的是字符串

  • post请求,参数解析,使用插件 koa-bodyparser

  • post 请求,接收参数,事件监听,回调,数据流

      // 用于接收数据
      let data = ''
    
      // 接收数据 ( chunk 为 Buffer 二进制 )
      ctx.req.on('data', (chunk) => {
        data += chunk
      })
    
      // 监听数据接收完毕
      ctx.req.on('end', () => {
        // 解码后 data 是 String 类型的数据 , 需要手动解析
        data = decodeURI(data)
      })
    
  • es7 异步编程 async/await 解决 callbackHell , 执行 async 函数返回 Promise 对象

    // demo
    function timeOut() {
      return new Promise(resolve => {
        setTimeout(() => {
          console.log(1);
          resolve();
        }, 2000)
      })
    }
    
    async function fn() {
      await timeOut();
      console.log(2);
    }
    
    fn(); // 1 2
    
  • MongoDB说明

    • doc

    • key-value 型数据库

    • 基于文档 , 存储所需空间大

    • 不支持事务操作

      • 事务指的是逻辑上的一组操作 , 组成这组操作的各个单元要么全都成功 , 要么全都失败

      • 事务作用 : 保证在一个事务中多次SQL操作要么全都成功 , 要么全都失败.

    • 在需要频繁读写数据库的场景下性能比关系型数据库更高

    • 而关系型数据库适用于含有较多表之间的级联查询的场景

你可能感兴趣的:(移动端农机商城项目后端开发笔记)