标签: nestjs

使用 class-validator 在 Nestjs 中添加所需参数的验证

使用类验证器,验证管道我想根据需要标记一些字段。我尝试使用@IsNotEmpty方法。当输入为空时,它会抛出 400 错误。但如果输入也丢失,我需要抛出错误。

DTO:地址对象,包含字段地址 1 和地址 2。我希望地址 1 为必需,地址 2 为可选

import {IsString, IsInt, IsNotEmpty } from 'class-validator';
import {ApiModelProperty} from '@nestjs/swagger';
export class Address {

    @ApiModelProperty({description: 'Address Line 1', required : true})
    @IsString()
    @IsNotEmpty()
    required : true
    address1: string;

    @ApiModelProperty({description: 'Address Line 2', required :false})
    @IsString()
    address2?: string;
}
Run Code Online (Sandbox Code Playgroud)
// App.js: Application file where validation pipes are defined.
async function bootstrap() {
    const expressServer = express();

    const app = await NestFactory.create(AppModule, expressServer, {bodyParser: true});
    app.use(bodyParser.json({limit: 6851000}));

    app.useGlobalInterceptors(new …
Run Code Online (Sandbox Code Playgroud)

class-validator nestjs

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

转换 multipart/form-data 请求正文然后使用validationPipe

我正在尝试使用转换将 formData 请求从字符串转换为 json 对象,然后使用validationPipe(类验证器)进行验证,但我得到

Maximum call stack size exceeded
    at cloneObject (E:\projectos\Gitlab\latineo\latineo-apirest\node_modules\mongoose\lib\utils.js:290:21)
    at clone (E:\projectos\Gitlab\latineo\latineo-apirest\node_modules\mongoose\lib\utils.js:204:16)
Run Code Online (Sandbox Code Playgroud)

尝试调试后,我进入控制器 3 次,对象保存在数据库中,但没有验证,内部 TransformJSONToObject 9 次...

我的 main.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe({ transform: true }));
  app.use(helmet());
  app.enableCors();
  app.use(
    rateLimit({
      windowMs: 15 * 60 * 1000, // 15 minutes
      max: 4000, // limit each IP to 100 requests per windowMs
    }),
  );
  app.use(compression());
  app.use('/upload', express.static(join(__dirname, '..', 'upload')));
  const options = new DocumentBuilder()
    .setTitle('XXX')
    .setDescription('XXX')
    .setVersion('1.0')
    .addBearerAuth()
    .build();
  const …
Run Code Online (Sandbox Code Playgroud)

transform typescript class-validator nestjs

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

oauth2 应该使用驼峰命名法吗?

所以我试图在nestjs中实现一个oauth2服务器,并且我一直在阅读规范[RFC 6749]
在规范中,所有查询参数名称甚至json响应都使用snake_case之类。

access_token
refresh_token
client_id
client_secret
redirect_uri
expires_in
Run Code Online (Sandbox Code Playgroud)

问题是,我的代码库的所有其余部分都使用camelCase,并且对一堆与oauth 相关的类使用snake_case 会使它们与代码库的其余部分不一致。

那么,我应该将所有 oauth 参数更改为驼峰命名法还是会被视为“不符合规范”。

javascript oauth-2.0 typescript nestjs

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

如何从 Postgres 获取我所在时区的日期

我尝试在主机上使用 TypeORM 和 Postgres 部署 JS 应用程序。在本地,我有一个 Postgress DB,因此在我自己的 TZ 中运行。远程主机恰好将其系统时间设置为 UTC:

$ date
Mon Oct 7 15:45:00 UTC 2019

$ psql
> select localtimestamp;
2019-10-07 15:45:00.123456
Run Code Online (Sandbox Code Playgroud)

我有一个表,其中有自动更新的日期(意味着它会在记录更新时更新)。

// my.entity.ts
@UpdateDateColumn({type: 'timestamp', name: 'lastUpdate', default: () => 'LOCALTIMESTAMP' })
lastUpdate: Date;
Run Code Online (Sandbox Code Playgroud)

一行在 12:00 CEST 插入:

> select "lastUpdate" from myTable;
2019-10-07 10:00:00.000000+00
Run Code Online (Sandbox Code Playgroud)

我想获取我的时区 (CEST) 中的日期,无论服务器时间如何,因此它应该返回我 2019-10-07 12:00。我不喜欢硬编码任何技巧,因为它也应该在我的 CEST 机器上工作。

Postgress 拥有所有信息:

> show timezone;
UCT
Run Code Online (Sandbox Code Playgroud)
  • 它知道它在 UTC 时间运行
  • 我可以告诉它我想要哪个时区的日期

所以我希望很容易将其转换为我要求的格式。但是,我发现以下示例似乎不起作用:

> select ("lastUpdate" at time zone 'CEST') from myTable;
2019-10-07 …
Run Code Online (Sandbox Code Playgroud)

postgresql typeorm nestjs

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

如何在端到端 (e2e) 测试中模拟 Nest typeorm 数据库模块?

全部。包含有关您目标的详细信息:我正在尝试在 e2e 测试中模拟存储库

描述预期和实际结果:对服务器的请求将无权访问持久层。我们应该模拟连接和存储库。

我已经更新了代码,但存储库仍然没有被覆盖。也许我需要通过 Facade 提供者来实现它

你可以在这里玩代码我的代码

database postgresql mocking typeorm nestjs

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

Nestjs全局缓存:CacheInterceptor问题

像文档一样全局配置缓存后,如果我在 app.module 之外使用 CacheInterceptor,它会抛出错误。

应用程序模块.ts

const cacheConfig = {
  store: redisStore,
  host: 'localhost',
  port: 6379
}

@Module({
  imports: [
    CacheModule.register(cacheConfig),
    CustomerModule,
  ],
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: CacheInterceptor
    }
  ]
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

客户模块.ts

@Module({
  imports: [TypeOrmModule.forFeature([CustomerRepository]), TypeOrmModule.forFeature([User])],
  controllers: [CustomerController]
})
export class CustomerModule {}
Run Code Online (Sandbox Code Playgroud)

客户控制器.ts

@Controller('customer')
export class CustomerController {
  constructor(
    @InjectRepository(CustomerRepository) private customerRepository: CustomerRepository,
    @InjectRepository(User) private userRepository: Repository<User>
  ) {}

  @Get()
  @UseInterceptors(CacheInterceptor)
  async get(): Promise<any> {
    const user = await this.userRepository.findOne({ where: { id: …
Run Code Online (Sandbox Code Playgroud)

nestjs

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

NestJS API 不适用于 MongoDB(索引键不能为空)

我想使用 TypeORM 通过 NestJS 创建一个 API。我使用过 Postgres 并且它有效,但我需要切换到 MongoDB。因此我做了一些改变。连接已建立,但随后我会立即收到此错误:

MongoError: Index keys cannot be empty.
Run Code Online (Sandbox Code Playgroud)

应用程序模块.ts

TypeOrmModule.forRoot({
      type: DATABASE_TYPE,
      url: DATABASE_HOST,
      port: DATABASE_PORT,
      username: DATABASE_USERNAME,
      password: DATABASE_PASSWORD,
      database: DATABASE_NAME,
      entities: [`${__dirname}/**/*.entity.{ts,js}`],
      synchronize: DATABASE_SYNCHRONIZE,
    })
Run Code Online (Sandbox Code Playgroud)

配置.ts

export const DATABASE_TYPE: any = process.env.DATABASE_TYPE || 'postgres';
export const DATABASE_USERNAME: string =
  process.env.DATABASE_USERNAME || 'admin';
export const DATABASE_PASSWORD: string =
  process.env.DATABASE_PASSWORD || 'asdsddddd';
export const DATABASE_HOST: string = process.env.DATABASE_HOST || 'localhost';
export const DATABASE_PORT: number = Number(process.env.DATABASE_PORT) || 5432;
export const DATABASE_NAME: string = …
Run Code Online (Sandbox Code Playgroud)

mongodb typescript typeorm nestjs

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

NestJS 中真的需要服务提供者吗?

我想了解将服务提供者注入 NestJS 控制器的目的是什么?这里的文档解释了如何使用它们,这不是这里的问题: https: //docs.nestjs.com/providers

我想要理解的是,在大多数传统的 Web 应用程序中,无论平台如何,许多进入 NestJS 服务的逻辑通常都会直接进入控制器。为什么 NestJS 决定将提供程序移至自己的类/抽象中?开发商在这里获得的设计优势是什么?

nestjs

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

NestJS 在构建应用程序时快速修复 swagger 错误

我正在使用fastify 适配器

根据文档我已经安装了用于 fastify 的 swagger 适配器

npm install --save @nestjs/swagger fastify-swagger

当我导入 swagger 对象时

import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';

在构建应用程序阶段出现多个错误:

node_modules/@nestjs/swagger/dist/decorators/api-body.decorator.d.ts:4:35 - error TS2304: Cannot find name 'Omit'.

4 declare type RequestBodyOptions = Omit<RequestBodyObject, 'content'>;
                                    ~~~~

node_modules/@nestjs/swagger/dist/decorators/api-header.decorator.d.ts:3:43 - error TS2304: Cannot find name 'Omit'.

3 export interface ApiHeaderOptions extends Omit<ParameterObject, 'in'> {
                                            ~~~~

node_modules/@nestjs/swagger/dist/decorators/api-param.decorator.d.ts:4:33 - error TS2304: Cannot find name 'Omit'.

4 declare type ParameterOptions = Omit<ParameterObject, 'in' | 'schema'>;
                                  ~~~~

node_modules/@nestjs/swagger/dist/decorators/api-property.decorator.d.ts:2:45 - error …
Run Code Online (Sandbox Code Playgroud)

node.js typescript nestjs fastify

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

将变量从配置服务传递到 Typescript 装饰器

我想为我的 NestJs 应用程序创建一个计划任务。它应该每 X 秒执行一次,因此我使用此处描述的间隔。

该应用程序使用配置文件,因此我可以使用保持间隔可配置。但是我如何将变量传递给 Typescript 装饰器呢?

NestJs为计划任务提供示例存储库

所以根据样本我想要类似的东西

@Injectable()
export class TasksService {
  constructor(
    private readonly myConfigService: MyConfigService,
  ) {}

  @Interval(this.myConfigService.intervalInMilliseconds)
  handleInterval() {
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我必须按照SchedulerRegistry文档中的描述使用吗?看来这对于标准 Typescript 来说是不可能的,请参阅此线程

javascript node.js typescript nestjs

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