NestJS宣布 v11版本。有什么更新?

2,223 阅读7分钟

我很兴奋地正式宣布NestJS 11的发布!此更新包含许多错误修复、增强和全新功能。虽然有太多的内容无法全部介绍,但让我们来探索一些最值得注意的亮点!

  • 让我们开始吧!🐈

记录器的增强

在这个版本中,NestJS中的默认日志记录器ConsoleLogger得到了重大升级。它现在包含了一些改进,例如更好地格式化深度嵌套的对象和数组,支持映射和集合,以及自定义日志前缀的能力。然而,突出的特性是对JSON日志的新的内置支持。

  • 你现在可以通过一个简单的配置来启用json格式的日志:
const app = await NestFactory.create(AppModule, {
  logger: new ConsoleLogger({
    json: true,
  }),
});

json选项设置为true可确保日志以json格式输出,使其成为容器化环境的理想选择。这样就可以无缝地解析和分析日志,而不需要第三方工具或库来进行JSON格式化。只需启用json选项,一切就都设置好了!

image.png 当启用JSON日志记录时,默认情况下颜色是关闭的。但是,你可以在本地开发时重新启用它们,通过将colors选项设置为true

const app = await NestFactory.create(AppModule, {
  logger: new ConsoleLogger({
    json: true,
    colors: true,
  }),
});

无论您是在本地开发还是部署到生产环境,这种灵活性都确保了日志的功能性和可视化可访问性。
查看[此PR](github.com/nestjs/nest…

更灵活的微服务

  • 随着NestJS 11的发布,所有官方支持的微服务传输器(如NATS、Kafka、Redis等)都得到了重大改进。这些升级旨在为开发人员提供更大的灵活性和可靠性,并控制他们与代理和服务的交互方式。无论您是在构建简单的服务还是高度复杂的分布式体系结构,这些新特性肯定会增强您的开发体验。
  • 新的unwrap方法允许直接访问底层客户端实例,支持超越标准NestJS API的自定义操作。例如,你可以访问原始的客户端实例并利用其本地方法或检查其内部状态:
import { NatsConnection } from 'nats';
// In the bootstrap function
const serviceRef = app.connectMicroservice({
  transport: Transport.NATS,
  options: {
    // NATS connection options here
  },
});
const connection = serviceRef.unwrap<NatsConnection>();
console.log(connection.info);

这里以 NATS 为例,但 unwrap 方法也适用于其他所有传输器。

此方法为您提供了对本机客户机及其特性的完全访问,支持高级用例,如检查连接详细信息、执行低级配置或扩展功能。
除了打开客户端实例之外,现在还可以使用新的on方法侦听底层客户端发出的内部事件。这对于监控关键事件(如断开连接或错误)特别有用:

const serviceRef = app.connectMicroservice({
  transport: Transport.NATS,
  options: {
    // NATS connection options here
  },
});
serviceRef.on<NatsEvents>('disconnect', () => {
  console.log('Client disconnected');
});
  • 此功能可以更轻松地实时响应网络问题或其他中断,确保您的应用程序保持弹性和响应性。
  • 另一个强大的新增功能是状态可观察流,它提供客户端实例当前状态的实时更新。通过订阅这个流,你可以动态地监控连接状态:
const serviceRef = app.connectMicroservice({
  transport: Transport.NATS,
  options: {
    // NATS connection options here
  },
});
serviceRef.status.subscribe((status) => {
  console.log('Status:', status);
});
  • 状态可观察对象发出 connectingconnecteddisconnected, 和 reconnecting (depending on the transporter)等事件,使您能够更深入地了解微服务的健康状况,并允许进行主动故障排除。
  • ClientProxy类还提供了相同的API方法集,确保在监视和与底层客户端实例交互时具有统一和一致的体验。无论您是使用它来处理事件还是观察客户端的状态,这个过程都是简单直观的。
// Injecting the client instance
constructor(
  @Inject(MATH_SERVICE) private readonly client: ClientProxy<NatsEvents>,
) {}
// Listening to events and status
this.client.on('disconnect', () => console.log('Disconnected'));
this.client.status.subscribe(status => {
  console.log('Status:', status);
});
  • 这些新功能使您能够更好地控制和洞察微服务,从而简化了复杂分布式系统的开发。有关更多示例和详细信息,请查看官方文档

更快的应用程序启动

  • 在NestJS 11中,我们彻底修改了模块不透明密钥生成过程,以改善应用程序的启动时间。
  • 在以前的版本中,框架使用哈希函数通过序列化动态模块的元数据来创建唯一标识符,从而为动态模块生成不透明的键。虽然这可以实现某些内部优化,但它也增加了不必要的复杂性和性能开销,特别是对于具有大输入的动态模块(例如JSON文件),其中哈希生成缓慢且效率低下。
  • 从v11开始,框架采用了一种更直接的方法。它现在不再散列整个模块元数据,而是使用对象引用来生成不透明的键。这种变化对大多数用户来说是透明的,但是对于具有大型动态模块的应用程序来说,它可以显著提高启动性能。

您可能注意到框架行为差异的唯一情况是,当您的应用程序多次导入相同的动态模块(使用完全相同的配置)时。在此场景中,框架现在将这些模块视为单独的实例,而在此之前,它们将被合并为单个实例。对于那些依赖这种行为的人来说,你可以把你的动态模块分配给一个变量,并多次导入它,以确保在整个应用程序中使用相同的实例。

Express v5 和 Fastify v5

  • NestJS 11现在支持最新版本的Express和fasttify,确保您拥有最新的依赖项。虽然升级到fasttify v5对大多数用户来说应该是平滑的,但由于底层库中的破坏性更改,升级到Express v5可能需要进行一些调整。
  • Express v5中最值得注意的更新之一是修改的路径路由匹配算法。路径字符串与传入请求的匹配方式进行了以下更改:
    • 通配符*必须有一个名称,匹配参数的行为:使用/*splat/{*splat}代替/*splat只是通配符参数的名称,没有特殊含义。您可以将其命名为任何您喜欢的名称,例如*通配符
    • 可选字符不再被支持,请使用大括号代替/:file{.:ext}
    • 不支持Regexp字符。
    • 参数名现在支持有效的JavaScript标识符,或者像this那样加引号。有些字符被保留以避免在升级过程中混淆 (()[]?+!), 使用 \ 来转义它们。

也就是说,以前在Express v4中工作的路由可能无法在Express v5中工作。例如:

@Get('users/*')
findAll() {
  // In NestJS 11, this will be automatically converted to a valid Express v5 route.
  // While it may still work, it's no longer advisable to use this wildcard syntax in Express v5.
  return 'This route should not work in Express v5';
}

要解决这个问题,你可以更新路由,使用一个命名通配符:

@Get('users/*splat')
findAll() {
  return 'This route will work in Express v5';
}

注意*splat是一个命名通配符,它匹配任何不含根路径的路径。如果您也需要匹配根路径(/users),您可以使用/users/{*splat},将通配符包装在大括号中(可选组)。请注意,splat只是通配符参数的名称,没有特殊含义。您可以将其命名为任何您喜欢的名称,例如 *通配符

查看迁移指南,了解更多关于Express v5中的变化,以及如何相应地更新路由。

其他一些有价值的更新

  • 终止生命周期钩子(' OnModuleDestroy ', ‘ OnApplicationShutdown ’等)的顺序被颠倒了。[阅读更多](docs.nestjs.com/migration-g…)
  • CacheModule已更新为使用最新版本的cache-manager (v6),它现在使用Keyv作为键值存储的统接口。请参阅[迁移指南](docs.nestjs.com/migration-g…
  • 一个新的ParseDatePipe已经被添加到@nestjs/common,使它更容易使用日期。

以上内容为机翻。