标签: nestjs

NestJS验证mongo objectid的@param格式

我正在使用 mongodb 作为我的数据库,使用 Nestjs 框架创建一个应用程序。在我的 CRUD findOne 方法中,我想验证发送的 ID 是否为 Mongo ObjectID,如果不是,则返回 400(默认情况下,如果让它流过,则返回 500)。我可以手动检查这一点,但是有没有办法注释参数以使此验证自动进行?

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.usersService.findOne(id);
  }
Run Code Online (Sandbox Code Playgroud)

validation mongodb nestjs

1
推荐指数
1
解决办法
1738
查看次数

如何用typeor进行排序?

该数据库包含以下数据:

[
  {id: 1, username: "test", amount: 2},
  {id: 2, username: "example", amount: 0},
  {id: 3, username: "hello", amount: 1},
  {id: 4, username: "fsa", amount: 0},
  {id: 5, username: "aas", amount: 10},
]
Run Code Online (Sandbox Code Playgroud)

现在我需要使用 typeorm 查询来检索数据,但我需要根据 amount 字段对其进行排序,并且限制只有 3 个用户,所以我应该得到这个:

 [
      {id: 5, username: "aas", amount: 10},
      {id: 1, username: "test", amount: 2},
      {id: 3, username: "hello", amount: 1},
    ]
Run Code Online (Sandbox Code Playgroud)

如何进行该查询?

node.js typeorm nestjs

1
推荐指数
1
解决办法
7552
查看次数

Nestjs 中角色保护文件的测试用例

我不确定如何编写guardin的单元测试用例文件nestjs。我有以下Role.guard.ts文件。我必须创建Role.guard.spec.ts文件。有人可以帮忙吗?

import { Injectable, CanActivate, ExecutionContext, Logger } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { ROLES_KEY } from './roles.decorator';
import { Role } from './role.enum';

@Injectable()
export class RolesGuard implements CanActivate {
    constructor(private reflector: Reflector) {}

    canActivate(context: ExecutionContext): boolean {
        const requiredRoles = this.reflector.getAllAndOverride<string[]>(ROLES_KEY, [
            context.getHandler(),
            context.getClass(),
        ]);

        const { user } = context.switchToHttp().getRequest();

        if (!user.role) {
            Logger.error('User does not have a role set');
            return false;
        }

        if (user.role …
Run Code Online (Sandbox Code Playgroud)

javascript unit-testing jestjs typeorm nestjs

1
推荐指数
1
解决办法
1405
查看次数

如何在nestjs中使用redis客户端?

我在 NestJs 中有一个微服务,这是 main.ts 文件:

async function bootstrap() {
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
    transport: Transport.REDIS,
    options: {
      url: 'redis://localhost:6379',
    }
  })
  await app.listen();
  console.log('Redis is running');
}
bootstrap();
Run Code Online (Sandbox Code Playgroud)

我想从服务调用 redis db:

import { createClient } from '@redis/client';

async createWorkspaceShareCode(data: GetWorkspaceShareCodeMessage) {
    const client = createClient({
      url: 'redis://localhost:6379'
    });
    await client.connect();

    await client.set('key', 'value');
    const value = await client.get('key');
    return value;
  }
Run Code Online (Sandbox Code Playgroud)

但这不是我想要的,问题如下:

  • 每次我发出请求时,它都会创建新的连接
  • 我需要在每个函数中编写此代码来连接到 Redis(即使我已经在 main.ts 文件中连接),问题是:如何在我的 NestJs 微服务中使用某种 RedisService?我已经尝试安装 redis 和 Nestjs-redis 库,但第一个会产生上述问题,第二个只会引发错误: https: //github.com/skunight/nestjs-redis/issues/97

javascript redis node.js microservices nestjs

1
推荐指数
1
解决办法
1万
查看次数

如何使用 Nestjs 护照使用电子邮件而不是用户名

我正在尝试使用 Passport 和 NestJS 来实现 JWT 身份验证,默认实现工作完美。就我而言,我想使用“电子邮件”而不是用户名,但不幸的是,位于 local.strategy.ts 内的验证函数仅接受“用户名”,并且在没有用户名参数的情况下甚至不会调用。请指教。

参考我使用过的实现,我一步一步按照指南进行操作

https://docs.nestjs.com/security/authentication

passport.js nestjs

1
推荐指数
1
解决办法
1815
查看次数

自定义参数装饰器,将参数转换为数据库实体

在 Laravel (php) 中有路线/article/:article,在控制器方法中我得到了模型:

function getArticle(ArticleModel $article) {...}
Run Code Online (Sandbox Code Playgroud)

如何在 NestJS 中做到这一点?我的控制器:

@Controller('/articles')
export class ArticlesController {
    @Get('/:article/edit')
    editArticle(@Param('article') articleId: number) {...}
}
Run Code Online (Sandbox Code Playgroud)

如何将 @Param('article') 转换为自定义装饰器 @ArticleParam() ,它将通过请求中的 id 返回我的 Article 实体?

nestjs

1
推荐指数
1
解决办法
5508
查看次数

NestJS:全局异常过滤器无法捕获基于 Kafka 的微服务应用程序抛出的任何内容

我们使用 NestJS 作为基于微服务的架构的 Typescript 框架。我们的一些部署被称为“Kafka 工作线程”,这些 pod 运行的代码实际上并不公开任何 REST 端点,而只是监听 kafka 主题并处理传入事件。

问题是,配置为希望捕获任何抛出异常的全局异常过滤器没有捕获任何内容(我们最终点头UnhandledPromiseRejection

异常过滤器的基本配置如下(遵循 NestJS 文档指南):

@Catch()
export class KafkaWorkerExceptionFilter implements ExceptionFilter {
  private logger: AppLogger = new AppLogger(KafkaWorkerExceptionFilter.name);

  catch(error: Error, host: ArgumentsHost): void {
    this.logger.error('Uncaught exception', error);
  }
}
Run Code Online (Sandbox Code Playgroud)

我们针对此类工作人员的控制器配置如下:

@Controller()
export class KafkaWorkerController {
  private readonly logger = new AppLogger(KafkaWorkerController.name);

  constructor(
  ) {
    this.logger.log('Init');
  }

  @EventPattern(KafkaTopic.PiiRemoval)
  async removePiiForTalent(data: IncomingKafkaMessage): Promise<void> {
    await asyncDoSomething();
    throw new Error('Business logic failed');
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我们期望全局异常过滤器捕获从控制器处理函数内部抛出的错误(以及从嵌套在其中进行同步/异步操作的实际函数抛出的实际错误)。这不会发生。


同样,按照 NestJS 文档实现此类过滤器,我尝试了多种方法以及“注册”该过滤器的方法组合,但没有成功:

  • 在顶级模块定义中列为提供者{ …

exception nestjs kafkajs nestjs-config nestjs-exception-filters

1
推荐指数
1
解决办法
2779
查看次数

如何在 NestJS 中的模块级别定义多个守卫?

我有一个 Nestjs 模块,我想在其中使用APP_GUARD提供程序定义多个守卫。文档中的示例仅显示如何定义单个守卫。如何定义多个守卫?

import { APP_GUARD } from '@nestjs/core';
import { Module } from '@nestjs/common';

@Module({
  providers: [
    {
      provide: APP_GUARD,
      useClass: MyFirstGuard, // how can I add a second guard here?
    },
  ],
})
export class AppModule {}

Run Code Online (Sandbox Code Playgroud)

nestjs

1
推荐指数
1
解决办法
1124
查看次数

类转换器 @Type() 装饰器不起作用

我有一个 dto 文件:

export class UpdateUserDto {
  @IsUUID()
  public readonly uuid: string;

  @IsObject()
  @Type(() => UserModelDto)
  public readonly dataToUpdate: UserModelDto;
}
Run Code Online (Sandbox Code Playgroud)

问题是,@Type() 装饰器似乎不起作用。我的 UserModelDto 看起来像这样:

export class UserModelDto {
  @IsUUID()
  @IsOptional()
  public uuid?: string;

  @IsEmail()
  @IsOptional()
  public email?: string;

  @IsString()
  @IsOptional()
  public password?: string;

  @IsJWT()
  @IsOptional()
  public refreshToken?: string;
}
Run Code Online (Sandbox Code Playgroud)

当我向控制器发送请求时,验证对字段不起作用,dataToUpdate但对它uuid有效。我尝试了很多方法但结果仍然相同。

node.js typescript class-validator nestjs class-transformer

1
推荐指数
1
解决办法
6391
查看次数

在 vscode 中调试时,nestjs 文件中的更改未生效

我在 vscode 中有一个 Nestjs 项目,在调试模式下代码中的更改不会生效。然而,断点正常命中,但例如看不到更改的变量值 - 即它们保持为先前的值(更改之前的值)。

我的 launch.json 如下:

{
    "version": "0.2.0",
    "configurations": [
      {
        "type": "node",
        "request": "launch",
        "name": "Debug Nest Framework",
        "runtimeExecutable": "nodemon",
        "runtimeArgs": ["--nolazy", "-r", "ts-node/register", "--config", "nodemon-debug.json"],
        "program": "${workspaceFolder}/src/main.ts",
        "autoAttachChildProcesses": true,
        "restart": true
      }
    ]
  }
Run Code Online (Sandbox Code Playgroud)

并且nodemon-debug.json文件具有以下内容:

{
"watch": ["src"],
"ext": "ts, js",
"ignore": ["src/**/*.spec.ts"]
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当我更改代码时,nodemon 确实注册了它并重新启动应用程序,从控制台可以看到:

C:\...\AppData\Roaming\npm\nodemon.cmd --nolazy -r ts-node/register --config nodemon-debug.json .\dist\main.js
[nodemon] 2.0.18
c:\...\AppData\Roaming\npm\node_modules\nodemon\lib\utils\log.js:34
[nodemon] to restart at any time, enter `rs`
c:\...\AppData\Roaming\npm\node_modules\nodemon\lib\utils\log.js:34
[nodemon] watching path(s): src\**\*
c:\...\AppData\Roaming\npm\node_modules\nodemon\lib\utils\log.js:34
[nodemon] watching extensions: …
Run Code Online (Sandbox Code Playgroud)

node.js nodemon nestjs vscode-debugger

1
推荐指数
1
解决办法
3403
查看次数