使用类验证器,验证管道我想根据需要标记一些字段。我尝试使用@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) 我正在尝试使用转换将 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) 所以我试图在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 参数更改为驼峰命名法还是会被视为“不符合规范”。
我尝试在主机上使用 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)
所以我希望很容易将其转换为我要求的格式。但是,我发现以下示例似乎不起作用:
> select ("lastUpdate" at time zone 'CEST') from myTable;
2019-10-07 …Run Code Online (Sandbox Code Playgroud) 全部。包含有关您目标的详细信息:我正在尝试在 e2e 测试中模拟存储库
描述预期和实际结果:对服务器的请求将无权访问持久层。我们应该模拟连接和存储库。
我已经更新了代码,但存储库仍然没有被覆盖。也许我需要通过 Facade 提供者来实现它
你可以在这里玩代码我的代码
像文档一样全局配置缓存后,如果我在 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) 我想使用 TypeORM 通过 NestJS 创建一个 API。我使用过 Postgres 并且它有效,但我需要切换到 MongoDB。因此我做了一些改变。连接已建立,但随后我会立即收到此错误:
MongoError: Index keys cannot be empty.
Run Code Online (Sandbox Code Playgroud)
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)
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) 我想了解将服务提供者注入 NestJS 控制器的目的是什么?这里的文档解释了如何使用它们,这不是这里的问题: https: //docs.nestjs.com/providers
我想要理解的是,在大多数传统的 Web 应用程序中,无论平台如何,许多进入 NestJS 服务的逻辑通常都会直接进入控制器。为什么 NestJS 决定将提供程序移至自己的类/抽象中?开发商在这里获得的设计优势是什么?
我正在使用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) 我想为我的 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 来说是不可能的,请参阅此线程。
nestjs ×10
typescript ×5
typeorm ×3
javascript ×2
node.js ×2
postgresql ×2
database ×1
fastify ×1
mocking ×1
mongodb ×1
oauth-2.0 ×1
transform ×1