升级请参考 如何更新 Midway 中描述,请不要单独升级某个组件包。
本次 3.17 版本,我们增加了一些新的特性,以及修复了一些问题,主要有:
- 1、使用 替换原有的上传组件
- 2、
busboy
上传的数据中的filedName
,在流式模式下不再提供 - 3、增加了一个新的服务端响应格式
- 4、class 中间件现在可以复用了
下面是更为细节的描述。
定制服务端响应格式
在 3.17 版本中,我们增加了一个新的特性,可以定制服务端的响应的通用格式。
在之前的版本中,我们依靠中间件和过滤器来实现这个功能,但是这种方式有一些局限性,代码也会分散在不同的地方。
如果由一个统一的可调整的返回逻辑,可能更为合理,为此,添加了 ServerResponse
和 HttpServerResponse
的实现。
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',
});
}
}
HttpServerResponse
是 ServerResponse
的一个 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() {}
}
但是如果希望用上继承,或者 match
和 ignore
功能的,则是类的行为更为方便。
这个版本框架提供了 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。