我正在尝试返回不同类型异常的自定义状态代码。尽管我正确地收到了响应,但我无法在不导致错误的情况下做到这一点。该错误仅发生在if 条件块内部(如果我在 post 请求中发送文件)。else 块中没有错误。
错误:检测到循环依赖性
// Below code gives this error => Error: cyclic dependency detected
import { Controller, Post, Req, Res, UseInterceptors, UploadedFile } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { Request, Response } from 'express';
@Controller('testing')
export class TestController {
constructor() { }
@Post('/upload')
@UseInterceptors(FileInterceptor('file'))
upload(@UploadedFile() file, @Res() response: Response) {
if (file && file !== undefined) {
return response.status(200).json({
status: "OK",
message: "File Uploaded"
});
} else {
return …Run Code Online (Sandbox Code Playgroud) 我正在使用 GraphQL 设置一个 NestJS 服务,作为 UI 和多个其他服务之间的中间人。对于此示例,我需要显示来自单个出版商的书籍及其相关信息的列表。
UI 将使用发布者的 ID 访问 Nest 服务。然后我需要调用服务并获取图书 ID 列表。当我有了 ID 列表时,我需要访问两个单独的服务,每个服务都返回每个图书 ID 的对象列表。然后,我需要从两个数据集中构建书籍对象列表。
书籍模型的一个例子是:
export class BookModel {
@Field(type => BookInformationModel)
bookInfo: BookInformationModel;
@Field(type => BookSalesModel)
bookSales: BookSalesModel;
}
Run Code Online (Sandbox Code Playgroud)
流程的一个示例是:
['book1', 'book2'][{id: 'book1' title: ...}, {id: 'book2' title: ...}][{price: 123 currency: ...}, {price: 456 currency: ...}][{
bookInfo: {id: 'book1' title: ...}
bookSales: {price: 123 currency: ...} …Run Code Online (Sandbox Code Playgroud) @Column({ name: 'device_kind', type: 'int2', nullable: false })
deviceKind?: number;
Run Code Online (Sandbox Code Playgroud)
谁能解释一下这段代码吗?我不明白他们为什么添加“?” 标记。其中一些有“!” 而不是问号。他们的意思是什么?
我尝试了下面的脚本,但没有成功。
{
"scripts": {
"start": "TZ='UTC' nest start"
}
}
Run Code Online (Sandbox Code Playgroud)
[系统信息]
操作系统版本:Linux 5.4
NodeJS 版本:v12.18.3
NPM 版本:6.14.6
[Nest CLI]
Nest CLI 版本:7.4.1
[Nest 平台信息]
platform-express 版本:7.0.0
Passport 版本:7.0.0
Typeorm 版本:7.1.0
普通版本:7.0.0
配置版本:0.5.0
核心版本:7.0.0
jwt 版本:7.0.0
我目前正在使用 TypeOrm 完成 NestJS 的数据库集成文档。在这些文档中,有一些示例展示了如何使用 NestJS 中的 app.module 注入自定义数据库存储库。所有这些示例都使用自定义存储库的实际类型注入类。
@Injectable()
export class AuthorService {
constructor(private authorRepository: AuthorRepository) {}
}
Run Code Online (Sandbox Code Playgroud)
此代码通过 app.modules 提供如下导入来注入:
@Module({
imports: [TypeOrmModule.forFeature([AuthorRepository])],
controller: [AuthorController],
providers: [AuthorService],
})
export class AuthorModule {}
Run Code Online (Sandbox Code Playgroud)
如果您擅长针对实现进行编程,那么这很有效,但我更喜欢在我的类中使用接口。我已经在上一个问题中找到了通过 NestJS 接口注入类的解决方案,但是当我尝试像这样注入自定义存储库时,它似乎没有正确实例化并且变得未定义。
(node:16658) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'save' of undefined
因此,我假设您只能通过forFeature()app.module 中的调用注入 customRepositories,但据我所知,这不允许我使用接口进行注入。有没有其他方法可以注入自定义 TypeOrm 存储库,而无需替换所有接口来实现自定义存储库?提前致谢!
编辑
这是我当前的代码,我设法将其注入,但这仍然迫使我在每次调用构造函数时使用实现而不是接口。这主要是由于模拟而进行测试时出现的问题。
@CommandHandler(FooCommand)
export class FooHandler
implements ICommandHandler<FooCommand> {
private fooRepository: IFooRepository; // Using Interface as a private property.
private barEventBus: IEventBus;
constructor(fooRepository: …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何使用 Axios 和 Nestjs 框架发出 http 请求。在 Nest 文档中,它提供了该过程的高级概述,但没有详细介绍如何处理使用 axios 发出请求时返回的 Observable。
我正在使用相互 SSL 身份验证向 API 发出请求。我遇到了证书问题,请求失败,但没有引发异常,控制器返回 200 ok,没有数据。当我注释掉所有 rxjs 代码并执行 axios.get(...).toPromise() 时,我发现了这一点。当我这样做时,我突然有了完整的堆栈跟踪并引发了异常。
知道我在这里做错了什么吗?我应该将 catchError 块放在 map 块之前吗?
我的代码:
getRegistrationStatus(msisdn: string): Observable<AxiosResponse> {
return this.httpService.get(`${this.API_BASE_URL}/vb/registrationStatus?MSISDN=${msisdn}`)
.pipe(
map(res => res.data),
catchError(e => {
throw new HttpException(e.statusText, e.status);
})
);
}
Run Code Online (Sandbox Code Playgroud)
我的 HTTP 模块/axios 配置:
HttpModule.register({
timeout: 20000,
validateStatus: () => true,
httpsAgent: new Agent({
ca: readFileSync(process.env.va_ca),
keepAlive: false,
cert: readFileSync(process.env.va_cert),
key: readFileSync(process.env.va_key),
passphrase: process.env.va_passphrase
})
})
Run Code Online (Sandbox Code Playgroud) 所以,这是我的 NEST JS 基本应用程序。
./shared/utils/config/index.ts
export default () => ({
PORT: parseInt(process.env.PORT, 10) || 3000,
TO_PRINT_RESPONSE: JSON.parse(process.env.TO_PRINT_RESPONSE),
});
Run Code Online (Sandbox Code Playgroud)
应用程序模块.ts
import CONFIG from './shared/utils/config/';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
load: [ CONFIG ],
})
]
// some more Module Decorator Config
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(AuthMiddleware)
.forRoutes({ path: '/someurl', method: RequestMethod.ALL });
// some more configuration code.
}
}
Run Code Online (Sandbox Code Playgroud)
主要.ts
// AppModule is app.module.ts imported variable
import { ConfigService } from '@nestjs/config';
async …Run Code Online (Sandbox Code Playgroud) 我有 NestJS API,它有一个用于修改资源的 PATCH 端点。我使用该class-validator库来验证有效负载。在 DTO 中,所有字段都通过@IsOptional()装饰器设置为可选。因此,如果我发送空负载,验证就会通过,然后更新操作就会出错。
我想知道是否有一种简单的方法可以像我一样将所有字段设置为可选,同时确保其中至少一个字段不为空,因此对象不为空。
谢谢!
是否可以在 NestJS 的一个注释中动态添加参数?
像这样:
const myParam = config.service.param;
@Annotation(myParam)
public myMethod() {
}
Run Code Online (Sandbox Code Playgroud) 你能告诉我是否可以在 Typescript 中创建这样的枚举吗?
public enum FooEnum {
ITEM_A(1), ITEM_B(2), ITEM_C(3);
private int order;
private FooEnum (int order) {
this.order = order;
}
public int getOrder() {
return order;
}
}
Run Code Online (Sandbox Code Playgroud)
我有这样的枚举:
export enum FooEnum {
ITEM_A = 'ITEM_A',
ITEM_B = 'ITEM_B',
ITEM_C = 'ITEM_C',
}
Run Code Online (Sandbox Code Playgroud)
我在 TypeORM 实体中使用
@Column({ type: 'enum', enum: FooEnum })
foo!: FooEnum
Run Code Online (Sandbox Code Playgroud)
我需要将枚举值分配给数字来定义它们的优先级。可以这样做吗?
我还想用常量创建值对象,如下所示,但我不知道在实体上使用此类,仍像“ITEM_A”字符串一样保存 Foo.ITEM_A
class Foo {
public static ITEM_A = new Country(1);
public static ITEM_B = new Country(2);
public static ITEM_C = new Country(3); …Run Code Online (Sandbox Code Playgroud) nestjs ×10
node.js ×5
typescript ×4
typeorm ×2
axios ×1
enums ×1
graphql ×1
java ×1
javascript ×1
rxjs ×1