Aller au contenu principal

· 2 minutes de lecture
Harry Chen

由于最近 node v18 标记为 LTS,社区相关的相关的依赖都移除了 node v12 的支持,导致 Midway 的基建,单测已经无法正常的执行。

虽然 Midway 框架本身支持在 Node v12 下运行,但是例如 jest 等工具的最新版本已经无法执行。经过内部讨论后决定,在 Github Action 中移除 Midway 以及相关库的 Node v12 的单测,为此,相关的依赖会进行调整,包括:

  • 1、脚手架的变更
    • @midwayjs/cli 升级为 ^2.0.0
    • jest@types/jestts-jest 升级为 v29 版本
    • typescript 升级为 4.8.x
  • 2、Midway 本身
    • 移除 node v12 的 github action 执行
    • 鉴于部分环境的情况,继续经验支持 node v12 的运行,有 node v12 的问题可以 issue 提问

依赖的变更可以参考:

"devDependencies": {
"@midwayjs/cli": "^2.0.0",
"@types/jest": "^29.2.0",
"jest": "^29.2.2",
"ts-jest": "^29.0.3",
"typescript": "~4.8.0"
}

· 3 minutes de lecture
Harry Chen

Features

1、支持了自定义的 web 参数装饰器

在 Web 场景下,我们已经有 @Query@Body 等参数装饰器,但是用于依旧有自定义的需求,如果这个时候通过现有的参数装饰器去定义会较为繁琐。

新版本提供了一个快速定义装饰器的能力,从而可以快速获取 ctx 属性。

import { createRequestParamDecorator } from '@midwayjs/core';

// 实现装饰器
export const Token = createRequestParamDecorator(ctx => {
return ctx.headers.token;
});

// 使用装饰器
export class UserController {
async invoke(@Token() token: string) {
console.log(token);
}
}

2、koa 组件新增 serverTimeout 配置

通过配置 serverTimeout 的值,可以定义服务端超时时间。

比如 1s 超时。

export const koa = {
serverTimeout: 1000,
}

3、多数据源时提供一个默认数据源的选项

原有 typeorm 等数据库,如果指定了多个数据源,会默认以最后一个配置的数据源作为默认数据源。

默认数据源在 InjectEntityModel 时可以不指定名字。

新版本可以通过显式的配置默认数据源,使得这个行为更可控。

比如:

// config.default.ts
export const typeorm = {
dataSource: {
abc: {},
bcd: {}
},
defaultDataSourceName: 'bcd',
}

这样在使用时,如果不指定 InjectEntityModel 的第二个参数,则会在 bcd 这个 dataSource 中查询 Entity。

3、新增了验证码组件

通过新增的验证码组件,可以生成在登录中常见的图片,计算表达式等类型的验证码。

效果如下:

Bugfix

修复了一个 import 顺序不一致,导致主框架获取错误的情况。

比如:

import * as bull from '@midwayjs/bull';
import * as koa from '@midwayjs/koa';

@Configuration({
imports: [koa, bull]
})
export class MainConfiguration {}

由于内部初始化是使用 require 的属性,即使 imports 的顺序固定,实际 bull 的 application 还是会变为 mainApp,这个时候去引入中间件,都会加到 bull 上,而不是 koa 上。

其他的更新

  • prometheus 支持用户定义 Histogram
  • faas 调整了 triggerFunction 方法的参数
  • 常态化依赖升级

· Une minute de lecture
Harry Chen

最近由于 axios 组件的升级,可能在单测时会出现下面的报错。

原因为脚手架自带的 jest v26 不支持 package.json 中的 exports 逻辑。

解决方法:

  • 1、将 package.json 中的 jest 版本从 v26 更新为 v29
  • 2、将 @midwayjs/cli 的版本升级为 1.3.16 版本以上,也可以升级到 2.0

示例如下:

{
"devDependencies": {
"@midwayjs/cli": "^2.0.1",
"@types/jest": "^29.2.0",
"jest": "^29.2.2",
"ts-jest": "^29.0.3",
// ...
}
}

· 2 minutes de lecture
Harry Chen

从 v3.6.0 开始,Midway 在代码层面将 @midwayjs/decorator 中的代码迁移到了 @midwayjs/core 中,未来 @midwayjs/decorator 包将逐步减少使用。

@midwayjs/decorator 中的代码全部从 @midwayjs/core 中代理出来,代码层面保持向下兼容。

最近发现有些用户会出现类似下面的报错:

原因有两类:

1、v3 的版本的 core 和组件版本不一致

在开发时,直接使用 npm install 而安装了 latest 版本(>=v3.6.0) 的组件。

由于 core 的版本依旧在 3.6.0 以下,但是组件依赖了最新版本 core 的 API,从而报错。

我们在文档 如何更新 Midway 中有描述,请不要单独升级某个组件包。

解决方案有两个:

  • 1、可以使用低版本的组件,比如 3.6.0 以下
  • 2、或者升级 core 和其他的版本统一到 3.6.0 以上

2、v2 的版本使用了 v3 的组件

在 v2 版本时,直接使用 npm install 而错误安装了 latest 版本(v3) 的组件。

我们为了适配最新的版本正好升级了 v3 的组件,从而暴露了引了错误的版本的这个问题。

现在 v2 和 v3 的组件不保证能完全兼容,所以请在安装时做好区分。

解决方案:使用 v2 版本的组件。

· 3 minutes de lecture
Harry Chen

v3.6.0 包含一个重大的 重构,我们将 @midwayjs/decorator 包和 @midwayjs/core 包的内容进行了整合,未来所有的 decorator 相关的内容,都会由 @midwayjs/core 导出,@midwayjs/decorator 包仅做代理,保持功能兼容。 后续,我们将会在文档上进行 decorator 包的移除操作,在这段时间中,大家还是会看到 decorator 和 core 并存的情况。

Features

1、守卫

从 v3.6.0 版本开始,我们提供了守卫能力,和 middleare,filter 类似,也是一个全框架复用的能力(koa/egg/grpc/rabbitmq/bull 等)

import { IMiddleware, Guard, IGuard } from '@midwayjs/core';
import { Context } from '@midwayjs/koa';

@Guard()
export class AuthGuard implements IGuard<Context> {
async canActivate(context: Context, suppilerClz, methodName: string): Promise<boolean> {
// ...
}
}

更多细节请查看 文档

2、鉴权

基于守卫功能的完成,我们可以自己定义 @Role 装饰器来完成简单的角色鉴权,同时我们也封装了 casbin 这一在社区较为通用的鉴权组件,方便大家使用。

比如,通过装饰器鉴权。

import { Controller, Get, UseGuard } from '@midwayjs/decorator';
import { AuthActionVerb, AuthGuard, AuthPossession, UsePermission } from '@midwayjs/casbin';
import { Resource } from './resouce';

@Controller('/')
export class HomeController {

@UseGuard(AuthGuard)
@UsePermission({
action: AuthActionVerb.READ,
resource: Resource.USER_ROLES,
possession: AuthPossession.ANY
})
@Get('/users')
async findAllUsers() {
// ...
}
}

casbin 组件目前实现了 redis 和 typeorm 两个可以复用的适配器供大家选择,如有其他需求,可以额外进行适配。

更多细节,可以查看 文档

3、bull 组件

我们新增了 bull 组件用于替代原有的 task 组件。

// invoke
const testQueue = this.bullFramework.getQueue('test');
// 立即执行这个任务
await testQueue?.runJob({
aaa: 1,
bbb: 2,
});

同时也提供了一个 bull-board 组件用于管理。

更多细节,可以查看 文档。

更多介绍可以查看我们的 b 站视频