跳到主要内容

· 阅读需 3 分钟
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 方法的参数
  • 常态化依赖升级

· 阅读需 1 分钟
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 分钟
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 分钟
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 站视频