文章

全栈博客-koa2版本

全栈博客-koa2版本

全栈博客-koa2版本

全栈博客-koa2版本

画板

知识点:npx

1
2
// 安装依赖koa-generator,然后执行 koa2 server
npx -p koa-generator koa2 server

知识点:ORM

Object-Relational Mapping,把关系数据库的表结构映射到对象上。

koa2

中间件

使用方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cont Koa = require('koa')
const app = new Koa()

app.use(async function m1(ctx, next){
  console.log('m1 start')
  await next()
  console.log('m1 end')
})

app.use(async function m2 (ctx, next){
  console.log('m2 start')
  await next()
  console.log('m2 end')
})

app.listen(3000, function(){})

打印的结果依次是: m1 start、m2 start、m2 end、m1 end

也就是,在m1的执行过程中,当执行到next()的时候,会来到m2中,当m2执行完后再回到m1中执行。其实,这也是一种典型的递归的执行顺序,这种函数嵌套执行的方式也被称作洋葱模型。

1631612421432-53bd23eb-309e-4420-b937-bfac648a3397.png 1631612429262-8d43352a-01dc-44e4-b9f7-88294a89f806.png第一张图是著名的洋葱模型图,第二张是洋葱模型中间件的示意图;

koa-router

Sequelize

模型定义

define 定义模型(表)

表名推断

  • 默认情况下,当未提供表名时,Sequelize 会自动将模型名复数并将其用作表名;
  • freezeTableName: true 强制表名等于模型名称,停止自动复数化;
  • tableName:'Employees' 直接定义表名。

模型同步

  • User.sync() - 如果表不存在,则创建该表(如果已经存在,则不执行任何操作)
  • User.sync({force: true}) - 将创建表,如果表已经存在,则将其首先删除
  • User.sync({alter: true}) - 这将检查数据库中表的当前状态(它具有哪些列,它们的数据类型等),然后在表中进行必要的更改以使其与模型匹配.

使用 sequelize.sync() 自动同步所有模型

###

时间戳 默认情况下,Sequelize 使用数据类型 DataTypes.DATE 自动向每个模型添加 createdAt-创建时刻时间戳 和 updatedAt-更新的时间戳 字段; 这些字段会自动进行管理 - 每当你使用Sequelize 创建或更新内容时,这些字段都会被自动设置。

注意: 这是在 Sequelize 级别完成的(即未使用 SQL触发器 完成). 这意味着直接 SQL 查询(例如,通过任何其他方式在不使用 Sequelize 的情况下执行的查询)将不会导致这些字段自动更新.

timestamps: false 禁用此行为

默认值

默认情况下 Sequelize 假定列的默认值为 NULL,可以通过 defaultValue 传递给列定义来更改此行为。

Sequelize.NOW 当前时间 - 可用于填充默认值

数据类型

字符串

1
2
3
4
5
6
7
DataTypes.STRING           		// VARCHAR(255)
DataTypes.STRING(1234)       	// VARCHAR(1234)
DataTypes.STRING.BINARY   	  // VARCHAR BINARY
DataTypes.TEXT              	// TEXT
DataTypes.TEXT('tiny')    		// TINYTEXT
DataTypes.CITEXT          	  // CITEXT          仅 PostgreSQL 和 SQLite.
DataTypes.TSVECTOR           	// TSVECTOR        仅 PostgreSQL.

布尔

1
DataTypes.BOOLEAN            	// TINYINT(1)

数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DataTypes.INTEGER            // INTEGER
DataTypes.BIGINT             // BIGINT
DataTypes.BIGINT(11)         // BIGINT(11)

DataTypes.FLOAT              // FLOAT
DataTypes.FLOAT(11)          // FLOAT(11)
DataTypes.FLOAT(11, 10)      // FLOAT(11,10)

DataTypes.REAL               // REAL            仅 PostgreSQL.
DataTypes.REAL(11)           // REAL(11)        仅 PostgreSQL.
DataTypes.REAL(11, 12)       // REAL(11,12)     仅 PostgreSQL.

DataTypes.DOUBLE             // DOUBLE
DataTypes.DOUBLE(11)         // DOUBLE(11)
DataTypes.DOUBLE(11, 10)     // DOUBLE(11,10)

DataTypes.DECIMAL            // DECIMAL
DataTypes.DECIMAL(10, 2)     // DECIMAL(10,2)

日期

1
2
3
DataTypes.DATE       // DATETIME 适用于 mysql / sqlite, 带时区的TIMESTAMP 适用于 postgres
DataTypes.DATE(6)    // DATETIME(6) 适用于 mysql 5.6.4+. 支持6位精度的小数秒
DataTypes.DATEONLY   // 不带时间的 DATE

其他参数

  • allowNull

将 allowNull 设置为 false 将为该列添加 NOT NULL,

这意味着如果该列为 null,则在执行查询时将从数据库引发错误.

如果要在查询数据库之前检查值是否不为 null,请查看下面的验证部分.

  • primaryKey:true

继续阅读有关主键的更多信息

  • autoIncrement:true

autoIncrement 可用于创建 auto_incrementing 整数列

  • field

指定自定义列名称

模型实例

  • 创建实例 create()
  • 删除实例 destroy()
  • 修改实例 update()
  • 重载实例 reload()

模型查询

验证和约束

**验证 **是在纯 JavaScript 中在 Sequelize 级别执行的检查,如果验证失败,则根本不会将 SQL 查询发送到数据库;

**约束 **是在 SQL 级别定义的规则,如果约束检查失败,则数据库将引发错误,在这种情况下,与验证不同,它执行了 SQL 查询。

本文由作者按照 CC BY 4.0 进行授权