koa2

egg.js 与 think.js 都是基于 koa 的

业务主要是为了「承载知识」。

开发 API:

  • Python Flask
  • Java SpringBoot
  • Node.js koa2

服务端编程,必须面向对象

flask, django

AppKey: wBAqB35gH5TCIswT

Lin CMS + Koa2 + Vue

服务端概念:

  • 悲观锁、乐观锁
  • 实务
  • 脏读、幻读

中间件 => 函数

中间件的调用一定会强制返回一个 Promise 实例

await 不仅可以对 Promise 实例求值,还可以对任意一个表达式求值。

总结下 await 的意义

  • 对 Promise 实例求值
  • 对表达式求值
  • 阻塞线程(转异步为同步)

Node.js 能力:

  • 脱离浏览器运行 js(最主要目的,而做 web 开发只是其中一个应用)
  • Node.js Stream (前端工程化的基础)
  • 服务端 API
  • 作为中间层

Koa2 特点

  • 洋葱圈模型
  • 精简,定制化能力更强,可以根据喜好、习惯进行二次开发,开发出非常好用的 高级 KOA

API

主题

需要遵循「代码开放原则」:修改关闭、扩展开发

API 携带版本号的方式

  1. 路径
  2. 查询参数
  3. Headers

函数设计

关于异常:

  1. 判断出异常,return false 或者 null
  2. throw new Error(这才是编程规范)

异常处理:

  • 方法 1:每个函数内部都 try catch,形成异常链
    • 缺点:只能捕捉同步异常,捉不到异步异常
  • 方法 2:设置全局异常异常处理

middlewares/exception.js // AOP 切面编程

  • 监听错误
  • 输出一段有意义的提示信息(msg, error_code, status , request_url)

错误:

  • 已知型错误
  • 未知型错误

参考书籍:《代码大全 v2》

js 设计缺陷

  • 1/0 不会报错
  • 0/0 也不会报错

https://blog.kaaass.net/archives/929

数据库

  • 关系型数据库
    • MS SQL Server
    • Oracle
    • PostgresSQL
    • Access
    • Redis
    • MongoDB

接口

接口保护(权限)

用户信息

加密:

web 概念

  • REST / SOAP

权限

角色:

  • 普通用户
  • 管理员

分级 scope 控制

业务逻辑

编写处:

  1. 在 API 接口处编写
  2. Model 分层

业务分层模型:

  • Model
  • Service

ThinkPHP:

  • Model
  • Service
  • Logic

主题

由粗到细

  • 实体表
  • 业务表(特点:抽象)

Basic Auth

在 header 请求头中做权限校验,主要是应用在 Authorization 字段中,认证 方式有多种,其中一种就是「Basic Auth」。

const basicAuthPayload = `${account}:${password}`;
const encodedPayload = Base64.encode(basicAuthPayload);

const reqOptions = {
    header: {
        Authorization: `Basic ${encodedPayload}`
    }
    query: {},
    data: {},
};
1
2
3
4
5
6
7
8
9
10

数据库事务

能确保对数据库一张或多张表的执行,要么都一起成功,要么其中一个失败,则都失败不执行。

保证数据的一致性。

MongoDB 早期版本没有数据库事务,也是被人诟病的一个点。但是后面 4.0 版本开始有了。

ACID:

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

Sequelize 的 应用

scope 应用

  • 可以在 Sequelize 的实例化上定义 scope,然后选择性地使用,很方便
  • 当然也可以单独单次使用

避免循环查询数据库

「in」查询,避免循环查询

高并发与并行

nodejs,单线程,只能并发,不能并行。

只有多线程或者多进程,才能执行并行任务。

并发:concurrency 并行:parallelism

js 的并发,是通过宏任务和微任务来实现的(EventLoop)

nodejs 单线程,高并发是优点这个点其实是相对的,对于多线程、多进程的语言来说,还是不足的;其真正的优势体现在于需要的硬件环境要求低,可以充分榨取单核CPU的性能

  • CPU 密集型
  • 资源密集型
    • 读写数据库
    • 读写文件
    • 网络资源请求

mysql 的 group 分组查询

JSON 对象的序列化

const obj = {
    name: 'TONY',
    age: 18,
    sex: 0,
    toJSON () {
        return {
            name: 'TONY STARk'
        };
    },
};

JSON.stringify(obj)
1
2
3
4
5
6
7
8
9
10
11
12

第三方库

  • module-alias
    • 使用 module-alias 别名简化 require 路径
  • koa-compose
    • 合并多个 middlewares 为一个
  • koa-mount
    • 针对挂载路径去加载中间件或者另一个应用
  • koa-static
    • 根据路由提供静态文件服务

相关链接