我正在探索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)
我正在使用其官方网站作为参考。
所需输出
笔记:
jmeter测试 API 调用。我希望在每次测试或测试运行开始时创建数据库表,以便 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)\nRun Code Online (Sandbox Code Playgroud)\n\n显然...如果我手动对数据库运行迁移,则不会失败e2e_test。
我的测试代码:
\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) 我在 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) 在 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系统是一个通过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单独实例化呢?
我正在开发一个 NestJS 应用程序,其中我的服务并不总是由控制器或任何 http 请求调用。相反,某些服务由 cron 计划调用来定期获取数据。
在这种情况下处理错误的最佳方法是什么?我实现了一个“catch-all”异常过滤器,但是当我的服务被“内部”调用(不是由控制器/请求)时,错误不会被捕获,并且我有一个未捕获的承诺错误。
我一直很难让子实体使用 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) 我\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我有这个方法,应该返回所有用户的所有帖子 基本上是这样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) 我有一个用 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)