比如说,我想创建一个简单化的电影院管理平台.它几乎不需要微服务:moviescinemaspayments等等.

在Nest你会怎么做.js?我不想把它们放在同一个大文件夹里,那样会让人觉得像是在做一块巨石.我想把它们分开.js项目有自己的git存储库,所以我以后可以用Kubernetes来协调它们.

怎样如果服务cinemas和服务movies是两个独立的项目,并且只共享Redis,那么如何连接它们?

编辑:

我不在乎传输层,我自己能搞清楚.我只是需要一些关于框架本身的建议,因为我认为文档是缺乏的.

推荐答案

我成功了.基本上,方法是创建两个独立的项目.比方说,一个是createMicroservice,另一个只是HTTP应用(但很容易成为另一种微服务).我使用了一个"普通"的应用程序,这样我就可以方便地调用它进行测试.

下面是创建microservice的main.ts个文件.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Transport } from '@nestjs/common/enums/transport.enum';

async function bootstrap() {
  const app = await NestFactory.createMicroservice(AppModule, {
    transport: Transport.REDIS,
    options: {
      url: 'redis://localhost:6379',
    },
  });
  await app.listen(() => console.log('MoviesService is running.'));
}
bootstrap();

其中一个控制器:

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @MessagePattern({ cmd: 'LIST_MOVIES' })
  listMovies(): string[] {
    return ['Pulp Fiction', 'Blade Runner', 'Hatred'];
  }
}

现在——在微服务中,您声明控制器应该对哪些类型的事件做出react (@MessagePattern).而在"正常"服务中,当你想向其他微服务请求某些东西时,你可以在控制器中执行此操作(main.ts是使用@nestjs/cli创建新项目时得到的最简单的示例).

控制器代码:

@Controller()
export class AppController {
  private readonly client: ClientProxy;

  constructor(private readonly appService: AppService) {
    this.client = ClientProxyFactory.create({
      transport: Transport.REDIS,
      options: {
        url: 'redis://localhost:6379',
      },
    });
  }

  @Get()
  listMovies() {
    const pattern = { cmd: 'LIST_MOVIES' };

    return this.client.send<string[]>(pattern, []);
  }
}

因此,只要client与微服务连接到同一传输层,它们就可以通过@MessagePattern相互通信.

为了获得更好的代码,您可以将this.client部分从构造函数移动到提供程序,然后通过在模块中声明提供程序来使用依赖项注入.

Typescript相关问答推荐

为什么当我试图从数据库预填充时,属性x不存在于类型{错误:字符串; }.ts(2339)上?

类型缩小对(几乎)受歧视的unions 不起作用

类型是工作.但它失go 了正确变体的亮点..为什么?或者如何增强?

TypScript ' NoInfer '类型未按预期工作

为什么ESLint抱怨通用对象类型?

带有联合参数的静态大小数组

用泛型类型覆盖父类函数导致类型y中的Property x不能赋给基类型Parent中的相同属性."'''''' "

TypeScript:在作为参数传递给另一个函数的记录中对函数的参数实现类型约束

对于合并对象中的可选属性(例如选项),类型推断可能是错误的

为什么T[数字]不也返回UNDEFINED?

有没有可能为这样的函数写一个类型?

为什么&;(交集)运算符会删除不相交的属性?

将接口映射到交叉口类型

如何正确地将元组表格输入到对象数组实用函数(如ZIP)中,避免在TypeScrip 5.2.2中合并所有值

Rxjs将省略的可观测对象合并到一个数组中

在TypeScript中,如何通过一系列过滤器缩小类型?

是否可以将类型参数约束为不具有属性?

如何为对象数组中的每个条目推断不同的泛型

Angular 16:无法覆盖;baseUrl;在tsconfig.app.json中

如何使用动态生成的键和值定义对象的形状?