标签: nestjs

速率限制功能在 Nestjs 应用程序中不起作用

我正在探索NestJS并且我正在尝试探索rate limit功能。

这是我的main.ts文件。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as rateLimit from 'express-rate-limit';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
  app.use(
    rateLimit({
      windowMs: 60 * 1000, // 1 minutes
      max: 10, // limit each IP to 100 requests per windowMs
    }),
  );
}
bootstrap();
Run Code Online (Sandbox Code Playgroud)

我正在使用其官方网站作为参考

所需输出

  • 用户每分钟调用 API/访问应用程序的次数不应超过 10 次。

笔记:

  • 我用来jmeter测试 API 调用。

rate-limiting node.js nestjs

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

TypeORM 和 NestJS:在 e2e 测试开始时创建数据库表

我希望在每次测试或测试运行开始时创建数据库表,以便 1) 所有迁移都针对测试数据库运行,或者 2) 单个迁移设置所有表(更快)。这与 Django 的做法类似

\n\n

有没有一种方法可以使用 TypeORM 轻松实现自动化,这样我就不需要手动维护测试数据库的副本?当然,在测试结束时,需要进行相反的拆卸和表清理。

\n\n

目前,我的测试失败:

\n\n
\xe2\x97\x8f User \xe2\x80\xba GET /users \xe2\x80\xba should return an array of users\n\n    QueryFailedError: relation "user" does not exist\n\n      at new QueryFailedError (../src/error/QueryFailedError.ts:9:9)\n      at Query.callback (../src/driver/postgres/PostgresQueryRunner.ts:178:30)\n      at Query.Object.<anonymous>.Query.handleError (../node_modules/pg/lib/query.js:145:17)\n      at Connection.connectedErrorMessageHandler (../node_modules/pg/lib/client.js:214:17)\n      at Socket.<anonymous> (../node_modules/pg/lib/connection.js:134:12)\n
Run Code Online (Sandbox Code Playgroud)\n\n

显然...如果我手动对数据库运行迁移,则不会失败e2e_test

\n\n

我的测试代码:

\n\n
\xe2\x97\x8f User \xe2\x80\xba GET /users \xe2\x80\xba should return an array of users\n\n    QueryFailedError: relation "user" does not exist\n\n      at new QueryFailedError (../src/error/QueryFailedError.ts:9:9)\n      at …
Run Code Online (Sandbox Code Playgroud)

jestjs typeorm nestjs

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

类验证器 @ValidateIf() 无法正常工作

我在 Nest js 中有以下类和此类验证器:

 @ValidateIf(val => val !== '*')
 @IsObject()
 @IsNotEmptyObject()
 queryParams: DbQuery | '*';
Run Code Online (Sandbox Code Playgroud)

如果我发送 '*' 它会返回

 [ 'queryParams must be a non-empty object' ] 
Run Code Online (Sandbox Code Playgroud)

node.js class-validator nestjs

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

带有守卫/装饰器的身份验证和角色:如何传递用户对象?

在 Guards/Decorators 的帮助下,我尝试首先检查 JWT,然后检查用户拥有的角色。

我已阅读有关身份验证、守卫和装饰器的文档并了解它们背​​后的原理。

但是,我无法做的是以某种方式使 JWT-Guard 中经过身份验证的用户可供 Roles-Guards 使用。

在我发现的每个例子中,正是我感兴趣的这部分被跳过/遗漏了......

感谢每一个提示!

这是我最近的尝试:

jwt.strategy.ts

import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
import { JwtPayload } from './jwt.model';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      passReqToCallback: true,
      ignoreExpiration: false,
      secretOrKey: '0000',
      expiresIn: '3 days'
    });
  }

  async validate(payload: JwtPayload) {
    return {
      id: payload.id,
      email: payload.email,
      username: payload.username
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

角色.guard.ts

import { …
Run Code Online (Sandbox Code Playgroud)

nestjs

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

NestJS:每个模块导入 HttpModule 的新实例

我的nestjs系统是一个通过API调用连接多个系统的系统。

对于每个系统,我创建了一个模块来处理它们的进程。这些模块中的每一个都导入HttpModule.

我想为每个模块的 HttpModule 都有单独的 Axios 拦截器。

这是我测试功能的尝试:

a.module.ts

@Module({
  imports: [
    HttpModule,
    // Other imports
  ],
  // controllers, providers and exports here
})
export class ModuleA implements OnModuleInit {
  constructor(private readonly httpService: HttpService) { }
  public onModuleInit() {
    this.httpService.axiosRef.interceptors.request.use(async (config: Axios.AxiosRequestConfig) => {
      console.log('Module A Interceptor');    
      return config;
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

模块 B 的模块类类似,但调用中的消息不同console.log

我尝试使用模块 B 中的服务对系统 B 进行 http 调用,但两条消息都显示在控制台中。

我认为http模块是整个系统中的单例,那么如何HttpModule为模块A和模块B单独实例化呢?

typescript axios nestjs

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

NestJS处理服务异常

我正在开发一个 NestJS 应用程序,其中我的服务并不总是由控制器或任何 http 请求调用。相反,某些服务由 cron 计划调用来定期获取数据。

在这种情况下处理错误的最佳方法是什么?我实现了一个“catch-all”异常过滤器,但是当我的服务被“内部”调用(不是由控制器/请求)时,错误不会被捕获,并且我有一个未捕获的承诺错误。

nestjs

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

TypeORM+nestjs:如何使用父泛型、单个控制器、存储库、子类型验证来序列化+CRUD子实体类?

我一直很难让子实体使用 REST api 自动工作。

我有一个基类:

class Block {

    @PrimaryGeneratedColumn('uuid')
    public id: string;

    @Column()
    public type: string;

}
Run Code Online (Sandbox Code Playgroud)

然后将其扩展到其他块类型,例如:

@Entity('sites_blocks_textblock')
class TextBlock extends Block {

    @Column()
    public text: string;

}
Run Code Online (Sandbox Code Playgroud)

我让每个块类型都有自己的实体,以便列可以正确序列化到数据库,并对每个属性进行验证。

所以...我有 10 多个块类型,并且我试图避免使用单独的控制器和 CRUD 端点来每个块类型。我只想要一个 BlockController、一个 /block 端点、POST 来创建,然后 PUT 到 /block/:id 上进行更新,这样它就可以从请求的“type”主体参数推断出块的类型。

问题是,在请求中,最后一个 @Body() 参数将不会验证(请求不会通过),除非我使用类型“any”...因为每个自定义块类型都传递它的额外/自定义属性。否则,我将不得不使用每个特定的 Block 子类作为参数类型,需要为每种类型提供自定义方法。

为了实现这一目标,我尝试使用自定义验证管道和泛型,我可以在其中查看传入的“类型”主体参数,并将传入数据强制转换或实例化为特定的块类型。

控制器处理程序:

@Post()
@UseGuards(PrincipalGuard)
public create(@Principal() principal: User,
          @Param('siteId', ParseUUIDPipe) siteId: string,
          @Body(new BlockValidationPipe()) blockCreate: any): Promise<Block> {

    return this.blockService.create(principal.organization, siteId, blockCreate);

}
Run Code Online (Sandbox Code Playgroud)

BlockValidationPipe(这应该将传入数据对象转换为特定的块类型,然后验证它,以该类型返回传入数据对象):

@Injectable()
export class BlockValidationPipe implements PipeTransform<any> {
    async …
Run Code Online (Sandbox Code Playgroud)

generics typescript typeorm nestjs

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

用于 MongoDB 的 NestJS TypeORM 插入后崩溃

我\xe2\x80\x99m 在 NestJS 和 TypeORM for MongoDB 中出现这种奇怪的行为。

\n\n

当我使用 创建新实体时this.repo.save(newEntity);,数据将保存到 MongoDB。但是,我也收到错误cannot read property \xe2\x80\x9ccreateValueMap()\xe2\x80\x9d of undefined.

\n\n

有针对这个的解决方法吗?

\n

mongodb node.js typescript nestjs

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

Nestjs - QueryFailedError:uuid 类型的输入语法无效

我有这个方法,应该返回所有用户的所有帖子 基本上是这样Select * from posts

  /**
   * Find all posts 
   */
  async findAll(): Promise<Post[]> {
    try {
      return await await getConnection()
      .createQueryBuilder()
      .select("posts")
      .from(Post, "posts").getMany();
    } catch (error) {
      throw new Error(error)      
    }
  }
Run Code Online (Sandbox Code Playgroud)

调用此方法时,这是 TypeORM 的响应

QueryFailedError: invalid input syntax for type uuid: "findAll"
Run Code Online (Sandbox Code Playgroud)

查询输出

SELECT DISTINCT
   "distinctAlias"."Post_post_id" as "ids_Post_post_id" 
FROM
   (
      SELECT
         "Post"."post_id" AS "Post_post_id",
         "Post"."uid" AS "Post_uid",
         "Post"."title" AS "Post_title",
         "Post"."sub_title" AS "Post_sub_title",
         "Post"."content" AS "Post_content",
         "Post"."userUserId" AS "Post_userUserId",
         "Post__comments"."comment_id" AS "Post__comments_comment_id",
         "Post__comments"."content" AS "Post__comments_content",
         "Post__comments"."postPostId" …
Run Code Online (Sandbox Code Playgroud)

postgresql uuid typeorm nestjs

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

如何使用 jest 测试服务 (NestJS) 中的模型 (Mongoose)

我有一个用 NestJS 完成的后端。在我的服务中,我注入了两个 Mongoose 模型。我使用 Jest 来测试该服务。模型按原样声明并注入到模块中:

quizes.providers.ts
import { Connection } from 'mongoose';
import { QuizSchema } from './schemas/quiz.schema';

export const quizesProviders = [
  {
    provide: 'CLASS_MODEL',
    useFactory: (connection: Connection) => connection.model('Quiz', QuizSchema),
    inject: ['DATABASE_CONNECTION'],
  },
];

users.providers.ts
import { Connection } from 'mongoose';
import { UserSchema } from './schemas/user.schema';

export const usersProviders = [
  {
    provide: 'USER_MODEL',
    useFactory: (connection: Connection) => connection.model('User', UserSchema),
    inject: ['DATABASE_CONNECTION'],
  },
];
Run Code Online (Sandbox Code Playgroud)

模块示例:

quizes.module.ts
import { Module } from '@nestjs/common';
import { QuizesController …
Run Code Online (Sandbox Code Playgroud)

mongoose node.js jestjs nestjs

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