Aller au contenu principal

Release 3.17.0

· 5 minutes de lecture
Harry Chen

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

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

  • 1、使用 busboy 替换原有的上传组件
  • 2、增加了一个新的服务端响应格式
  • 3、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
  • 3、原有上传的数据中的 filedName,在流式模式下不再提供

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

更多细节请访问 文档

类中间件复用

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

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