Skip to main content

14 articles tagués avec « release »

Voir tous les tags

Release 3.19.0

· 3 minute read
Harry Chen
Maintainer of Midway

升级请参考 如何更新 Midway 中描述,请不要单独升级某个组件包。

本次 3.19 版本,主要引入了 Kafka 组件的重构,以及一些性能优化和 bug 修复。

下面是更为细节的描述。

Kafka 组件重构

从 v3.19 开始,Kafka 组件进行了重构,配置和使用方法与之前有较大差异。虽然原有的使用方式仍然兼容,但文档不再保留。新的 Kafka 组件提供了更灵活的配置和更强大的功能。

// src/config/config.default.ts
export default {
kafka: {
consumer: {
sub1: {
connectionOptions: {
clientId: 'my-app',
brokers: ['localhost:9092'],
},
consumerOptions: {
groupId: 'groupId-test-1',
},
subscribeOptions: {
topics: ['topic-test-1'],
}
},
},
producer: {
clients: {
pub1: {
connectionOptions: {
clientId: 'my-app',
brokers: ['localhost:9092'],
},
producerOptions: {
// ...
}
}
}
}
}
}

更多的内容,请参考 Kafka 组件文档

Mock 功能分组

3.19.0 开始,Midway 的 mock 功能支持通过分组来管理不同的 mock 数据。你可以在创建 mock 时指定一个分组名称,这样可以在需要时单独恢复或清理某个分组的 mock 数据。

import { mockContext, restoreMocks } from '@midwayjs/mock';

it('should test mock with groups', async () => {
const app = await createApp();

// 创建普通对象的 mock
const a = {};
mockProperty(a, 'getUser', async () => {
return 'midway';
}, 'group1');

// 创建上下文的 mock
mockContext(app, 'user', 'midway', 'group1');
mockContext(app, 'role', 'admin', 'group2');

// 恢复单个分组
restoreMocks('group1');

// 恢复所有分组
restoreAllMocks();
});

通过分组,你可以更灵活地管理和控制 mock 数据,特别是在复杂的测试场景中。

新增了一个启动性能分析的命令

在开发环境下,新增了一个 perf-init 命令,用于在启动时初始化性能分析,需要配合最新的 mwtsc 一同使用。

{
"scripts": {
"dev": "cross-env NODE_ENV=local mwtsc --watch --run @midwayjs/mock/app.js --perf-init"
}
}

其他更新

  • 更新了一些依赖库以提高安全性和稳定性。

更多的更新内容和详细信息,请参考我们的 ChangeLog

Release 3.18.0

· 2 minute read
Harry Chen
Maintainer of Midway

升级请参考 如何更新 Midway 中描述,请不要单独升级某个组件包。

本次 3.18 版本,主要修复了新的 busboy 组件的一些遗留问题,以及新增了一种上传模式。

下面是更为细节的描述。

异步迭代器上传模式

为了支持单次多个文件的流式上传,新版本使用了异步迭代器模型转换了上传流,这个新的模式用于替代原有的流式模式。

// src/config/config.default.ts
export default {
// ...
busboy: {
mode: 'asyncIterator',
},
}

装饰器的入参也已经变成了异步迭代器。

import { Controller, Post, Files, Fields } from '@midwayjs/core';
import { UploadStreamFileInfo, UploadStreamFieldInfo } from '@midwayjs/busboy';

@Controller('/')
export class HomeController {

@Post('/upload', /*...*/)
async upload(
@Files() fileIterator: AsyncGenerator<UploadStreamFileInfo>,
@Fields() fieldIterator: AsyncGenerator<UploadStreamFieldInfo>
) {
// ...
}
}

我们可以通过循环迭代器获取到每个上传的文件。

for await (const file of fileIterator) {
const { filename, data } = file;
// ...
}

进而可以方便的做后续处理。

更多的内容,请参考 细节文档

此外还有更多的变化

  • 流式上传时的 fieldName 字段现在恢复了
  • httpClient 现在默认的配置不再会被单次请求覆盖
  • 数据源的优先级 NPE 报错现在已经修复了
  • 业务中的 https 配置现在在 dev 的输出提示中也变得正常了

以及一大批依赖进行了更新,可以参考我们的 ChangeLog

Release 3.17.0

· 5 minute read
Harry Chen
Maintainer of Midway

升级请参考 如何更新 Midway 中描述,请不要单独升级某个组件包。

本次 3.17 版本,我们增加了一些新的特性,以及修复了一些问题,主要有:

  • 1、使用 替换原有的上传组件
  • 2、busboy 上传的数据中的 filedName,在流式模式下不再提供
  • 3、增加了一个新的服务端响应格式
  • 4、class 中间件现在可以复用了

下面是更为细节的描述。

定制服务端响应格式

在 3.17 版本中,我们增加了一个新的特性,可以定制服务端的响应的通用格式。

在之前的版本中,我们依靠中间件和过滤器来实现这个功能,但是这种方式有一些局限性,代码也会分散在不同的地方。

如果由一个统一的可调整的返回逻辑,可能更为合理,为此,添加了 ServerResponseHttpServerResponse 的实现。

import { ServerResponse, HttpServerResponse } from '@midwayjs/core';

@Controller()
export class HomeController {
@Inject()
ctx: Context;

@Get('/')
async index() {
return new HttpServerResponse(this.ctx).json({
success: true,
data: 'hello world',
});
}
}

HttpServerResponseServerResponse 的一个 Http 实现,提供了一些常用的方法。

最为特殊的是他可以针对不同的数据格式,设置成功和失败的模版。

比如针对 JSON 数据,框架提供了以下的默认结构。

HttpServerResponse.JSON_TPL = (data, isSuccess) => {
if (isSuccess) {
return {
success: 'true',
data,
};
} else {
return {
success: 'false',
message: data || 'fail',
};
}
};

这样,当返回 JSON 格式时,就会按照这个模版进行返回。

// 失败的返回
return new HttpServerResponse(this.ctx).fail().json('hello world');

就会获取到以下的数据。

{
success: 'false',
message: 'hello world',
}

此外,基于这个模式,也同时实现了 SSE 的响应返回,也有其他的一些数据结构的返回,更多的内容,请参考 细节文档

上传组件

由于在小文件场景下上传碰到一些问题,从 v3.17 开始,基于 busboy 实现了一个新的上传组件,替换原有的 @midwayjs/upload

和原有的组件比有一些不同。

  • 1、不再默认加载中间件,因为上传只是少部分接口的特殊逻辑,不需要全局加载
  • 2、配置的 key 为了避免冲突,从 upload 变为 busboy

其余的使用方式和原有的上传组件一致,

更多细节请访问 文档

类中间件复用

在之前,如果需要复用中间件,只能使用函数中间件。

const mw = (ctx, next) => {
// ...
}

@Controller(/**/)
export class HomeController {

@Get('/', { middleware: [mw]})
async home() {}

@Get('/api', { middleware: [mw]})
async api() {}
}

但是如果希望用上继承,或者 matchignore 功能的,则是类的行为更为方便。

这个版本框架提供了 createMiddleware 功能,保留原有的逻辑同时,可以创建出一个新的中间件实例。


@Middleware()
export class ReportMiddleware implements IMiddleware<Context, NextFunction> {
// ...
}

@Controller(/**/)
export class HomeController {

@Get('/', { middleware: [createMiddleware(ReportMiddleware, {}, 'name1')]})
async home() {}

@Get('/api', { middleware: [createMiddleware(ReportMiddleware, {}, 'name2')]})
async api() {}
}

通过向 createMiddleware 传递不同的参数,以及中间件名字,就可以引用到不同的逻辑。

更多的细节,请查看 Web中间件 文档。

更多的变化

  • 修复了一个多语言匹配 key 的问题
  • 一些不合理类型定义的调整

以及一大批依赖进行了更新,可以参考我们的 ChangeLog

Release 3.16.0

· 2 minute read
Harry Chen
Maintainer of Midway

升级请参考 如何更新 Midway 中描述,请不要单独升级某个组件包。

本次 3.16 版本,重构了 Swagger 组件,新增了一个租户组件。

Tenant

新增组件,提供 TenantManager 跨作用域管理租户信息。

比如:

import { TenantManager } from '@midwayjs/tenant';
import { Middleware, Inject, Singleton } from '@midwayjs/core';

// 请求链路中设置,中间件或者 Controller
@Middleware()
class TenantMiddleware {
@Inject()
tenantManager: tenant.TenantManager;

resolve() {
return async(ctx, next) => {
this.tenantManager.setCurrentTenant({
id: '123',
name: '我的租户'
});
}
}
}

// 服务中
@Singleton()
class TenantService {
@Inject()
tenantManager: tenant.TenantManager;

async getTenantInfo() {
const tenantInfo = await this.tenantManager.getCurrentTenant();
console.log(tenantInfo.name);
// 我的租户
}
}

MQTT

增加一个动态添加 mqtt 的方法。

import { Configuration, Inject } from '@midwayjs/core';
import * as mqtt from '@midwayjs/mqtt';

@Configuration({
// ...
})
class MainConfiguration {

@Inject()
mqttFramework: mqtt.Framework;

async onReady() {
await this.mqttFramework.createSubscriber({
host: 'test.mosquitto.org',
port: 1883,
}, {
topicObject: 'test_midway_dynamic',
}, TestSubscriber, 'test');
}
}

Swagger

代码重构,支持了 oneof 等特殊用法,增加几十个用例确保输出和 openapi 3.0 一致。

比如:

import { ApiProperty } from '@midwayjs/swagger';  

class Album {
@ApiProperty()
id: number;

@ApiProperty()
name: string;
}

class Photo {
@ApiProperty({
oneOf: [
{ type: 'string' },
{
type: 'array',
items: {
type: 'string',
},
},
],
})
name: string | string[];

@ApiProperty({
oneOf: [
{ type: Album },
{
type: 'array',
items: {
type: () => Album,
},
},
],
})
album: Album | Album[];
}

koa

提供了 query 的 parse 相关配置。

mwtsc 工具

切换回 tsc 自带的监听,稳定性更好。

更多的变化

  • 修复了一个健康检查服务丢失 this 的问题
  • 参数装饰器增加了一个当前实例的参数

以及一大批依赖进行了更新,可以参考我们的 ChangeLog

Release 3.15.0

· One minute read
Harry Chen
Maintainer of Midway

开工大吉。

升级请参考 如何更新 Midway 中描述,请不要单独升级某个组件包。

本次 3.15 版本,主要新增了 MQTT 组件。

全新的 MQTT 组件

可以通过配置 subpub 创建多个不同的实例,方便满足用户需求。

更多细节可以接着查看 文档

Swagger 方法级别的 Security 忽略

现在可以通过 @ApiExcludeSecurity 来忽略特定的接口。

mwtsc 工具支持了 Alias Path 的识别和替换

现在新工具已经可以认识 Alias 路径了。

更多的变化

  • @koa/router 升级到了 v12 版本
  • 自定义参数装饰器支持抛出异常

此外,还有一大批依赖进行了更新,更多可以参考我们的 ChangeLog