标签: nestjs

TypeORM 找不到“MyEntity”的元数据

我 1. 在“app-data-source.ts”上有以下数据源

import { DataSource } from "typeorm";
import { App } from "./entities/app";

export const appDataSource = new DataSource({
    type: 'postgres',
    host: process.env.CONFIG_DB_HOST,
    port: 5432,
    username: process.env.CONFIG_DB_USER,
    password: process.env.CONFIG_DB_PASSWORD,
    database: process.env.CONFIG_DB_DATABASE,
    entities: [App],
    synchronize: false,
});

Run Code Online (Sandbox Code Playgroud)
  1. 它在“entities/app.ts”上使用实体应用程序
import { Column, Entity, PrimaryColumn } from "typeorm";

@Entity('apps')
export class App {
    @PrimaryColumn()
    tenant_id: number;
    
    @Column()
    client_id: string;
    
    @Column()
    legacy_client_id: string;

    @Column()
    user_pool: string;
}
Run Code Online (Sandbox Code Playgroud)
  1. 以及查询实体应用程序的以下模块(如上图 2 所示)。
import { App } from './entities/app';
import { appDataSource } from …
Run Code Online (Sandbox Code Playgroud)

postgresql datasource typeorm nestjs

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

Nest 无法解析 X 的依赖关系。请确保索引 [1] 处的参数 HttpService 在模块上下文中可用

我在使用 Nestjs HttpModule 时遇到问题

错误: Nest can't resolve dependencies of the ShopService (PrismaService, ?). Please make sure that the argument HttpService at index [1] is available in the QaModule context.

我的商店模块:

@Module({
    imports: [HttpModule],
  controllers: [ShopController],
  providers: [ShopService, PrismaService],
})

export class ShopModule {}
Run Code Online (Sandbox Code Playgroud)

我的 Qa 模块:

@Module({
  controllers: [QaController],
  providers: [QaService, PrismaService, ShopService],
})
export class QaModule {}
Run Code Online (Sandbox Code Playgroud)

解决办法有哪些?

javascript node.js nestjs

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

为什么我的 docker 容器不监听文件中的更改

所以我已经使用 docker-compose 在 NestJS 和 Docker 上开发这个后端大约 6 个月了,但从来没有遇到过我的 docker 不监听我的文件更改的问题。几天前,这种情况开始发生,我不知道为什么。

\n

这是我的 Dockerfile

\n
FROM node:14-alpine\n\nENV NODE_ENV development\n\nENV NODE_OPTIONS=--max_old_space_size=8192\n\nRUN mkdir -p /usr/src/app\n\nWORKDIR /usr/src/app\n\nCOPY . .\n\nRUN yarn install\n\nENTRYPOINT ["yarn", "start:dev"]\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的 docker-compose 文件

\n
services:\n  api:\n    image: cacao-be\n    container_name: cacao-be-api\n    build:\n      context: .\n      dockerfile: Dockerfile\n    ports:\n      - '3000:3000'\n    depends_on:\n      - postgres\n    volumes:\n      - ./src:/usr/src/app/src\n    networks:\n      - default\n    links:\n      - redis\n    env_file:\n      - .env\nvolumes:\n  db_data:\n  admin_data:\n  redis_data:\n    driver: local\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的 package.json,其中包含启动我的项目的脚本

\n
"scripts": {\n    "prebuild": "rimraf dist",\n    "build": "nest …
Run Code Online (Sandbox Code Playgroud)

typescript docker docker-compose nestjs

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

在 NestJS 中使用 Passport JWT 出现未经授权的 401(缺少凭据)

我尝试使用 JWT 在 NestJS API 中对用户进行身份验证,但总是收到相同的错误:未经授权 401。

在我告诉你我的调查结果是空的之前,让我向你展示我的代码:

JWT 生成(此代码工作正常)

auth.module.ts

import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { JwtModule } from '@nestjs/jwt';
import { UserModule } from 'src/user/user.module';
import { AuthService } from './auth.service';
import { LocalAuthController } from './local/local-auth.controller';
import { JwtStrategy } from './jwt/jwt.strategy';

@Module({
    imports: [
        ConfigModule,
        JwtModule.register({
            secretOrPrivateKey: 'a'
        }),
        UserModule],
    providers: [AuthService, JwtStrategy],
    controllers: [LocalAuthController]
})
export class AuthModule {}
Run Code Online (Sandbox Code Playgroud)

auth.service.ts

import { Injectable, UnauthorizedException } from …
Run Code Online (Sandbox Code Playgroud)

jwt typescript passport.js nestjs passport-jwt

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

NestJS:如何使用自定义装饰器访问控制器函数响应?

这是我的装饰师

import { createParamDecorator, ExecutionContext } from "@nestjs/common";

export const CacheData = createParamDecorator(
    (data: any, ctx: ExecutionContext) => {
        const request = ctx.switchToHttp().getRequest();
        console.log(request.url, request.method, 'request');
        const response = ctx.switchToHttp().getResponse();
        const reqBody = request.body;
        console.log(reqBody, 'reqBody');
        console.log(response.raw.req.data, 'response');
        console.log(response.raw.req.body, 'response');
        console.log(response.raw.data, 'response');
        console.log(response.cacheData, 'response');
    }
);
Run Code Online (Sandbox Code Playgroud)

在我的控制器函数中,我使用装饰器,如下所示:

getStringsArr(
    @Headers('Authorization') auth: string,
    @Headers('Country') country = 'DK',
    @CacheData() cacheData,
  ): Array<string> {
return ['Hello', 'World', '!'];
}
Run Code Online (Sandbox Code Playgroud)

那么如何在 CacheData 装饰器中访问响应数据呢?

node.js nestjs nestjs-fastify

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

有条件地将服务类实例化为 NestJS 中的提供者

我有一个名为 的控制器User和两个服务类:UserAdminServiceUserSuperAdminService。当用户向控制器的任何端点发出请求时User,我想检查发出请求的用户是管理员还是超级管理员(基于令牌中的角色)并实例化正确的服务(UserAdminServiceUserSuperAdminService)。请注意,这两个服务实现相同的UserService接口(只是方法的内部发生了一些变化)。我怎样才能用 NestJS 做到这一点?

我尝试过的:

用户模块.ts

providers: [
    {
      provide: "UserService",
      inject: [REQUEST],
      useFactory: (request: Request) => UserServiceFactory(request)
    }
  ],
Run Code Online (Sandbox Code Playgroud)

用户服务.factory.ts

export function UserServiceFactory(request: Request) {

    const { realm_access } = JwtService.parseJwt(
        request.headers["authorization"].split(' ')[1]
    );
    if (realm_access["roles"].includes(RolesEnum.SuperAdmin))
        return UserSuperAdminService;
    else
        return UserAdminService;
}
Run Code Online (Sandbox Code Playgroud)

用户控制器.ts

  constructor(
      @Inject("UserService") private readonly userService: UserServiceInterface
  ) {}
Run Code Online (Sandbox Code Playgroud)

我的代码不起作用的原因之一是因为我返回的是类而不是工厂中的实例化对象,但我希望 NestJS 解决服务依赖关系。有任何想法吗?

javascript dependency-injection nestjs

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

Nestjs 使用 @UploadedFile 装饰器上传文件:如何使参数非强制?

使用 Nest.js,我尝试为我的膳食计划应用程序中的一种成分编写一条创建(发布)路线。该路由将接收描述(可选)和名称(强制)作为请求正文,以及可选图像。我使用 Objection.js 作为 ORM。

我阅读了有关使用 Multer 处理文件上传 Nest.js 文件上传的 Nest.js 文档,并尝试按照文档中的方式进行操作。问题是,我在任何地方都找不到如何使用 UploadedFile 装饰器同时使文件可选。当我尝试通过 Postman 创建没有图像的新成分时,收到以下错误消息:

{
    "statusCode": 400,
    "message": "File is required",
    "error": "Bad Request"
}
Run Code Online (Sandbox Code Playgroud)

有人在这里偶然发现过这个问题并找到了使参数可选的解决方案吗?我知道我可以创建一个补丁路径来修改成分并在之后添加图像作为解决方法,但我想知道在保持实际情况的同时是否可以做些什么。

这是我的控制器的代码:

@Post()
  @UseInterceptors(
    FileInterceptor('image', {
      storage: diskStorage({
        destination: './assets/images/ingredient',
        filename: getUniqueFileName,
      }),
    }),
  )
  @UseFilters(DeleteFileOnErrorFilter)
  async create(
    @Body() dto: CreateIngredientDto,
    @UploadedFile(
      new ParseFilePipe({
        validators: [new FileTypeValidator({ fileType: '.(png|jpeg|jpg)' })],
      }),
    )
    image?: Express.Multer.File,
  ): Promise<IngredientModel> {
    return this.ingredientService.create(dto, image);
  }
Run Code Online (Sandbox Code Playgroud)

以及从 Service 调用的 create 方法:

async create(
    dto: CreateIngredientDto,
    image?: Express.Multer.File, …
Run Code Online (Sandbox Code Playgroud)

file-upload typescript multer nestjs

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

如何列出 Nestjs DTO 类的属性?

我有以下 Nestjs DTO 类:

// create-job-offer.dto.ts
import { IsOptional, IsNumber } from 'class-validator';

export class CreateJobOfferDto {
  @IsNumber()
  @IsOptional()
  mentorId: number;

  @IsNumber()
  @IsOptional()
  companyId: number;
}
Run Code Online (Sandbox Code Playgroud)

我想获取类属性列表:['mentorId', 'companyId']

到目前为止,我在控制器中尝试了以下方法但没有成功:

Object.getOwnPropertyNames(new CreateJobOfferDto());
Object.getOwnPropertyNames(CreateJobOfferDto);

Object.getOwnPropertySymbols(new CreateJobOfferDto());
Object.getOwnPropertySymbols(CreateJobOfferDto);

Object.getOwnPropertyDescriptors(CreateJobOfferDto);
Object.getOwnPropertyDescriptors(new CreateJobOfferDto());

Object.getPrototypeOf(CreateJobOfferDto);
Object.getPrototypeOf(new CreateJobOfferDto());
Run Code Online (Sandbox Code Playgroud)

如果我在构造函数中添加方法或变量,我可以获取它们,但不能获取属性。

我想实现这一目标的原因是,我正在使用 Prisma 和 React,并且在我的 React 应用程序中我想接收类属性列表,以便我可以动态生成模型表单。

javascript nestjs prisma

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

Nest 找不到 PrismaService 元素(当前上下文中不存在此提供程序)

我试图在我的 main.ts 上获取 PrismaService,但它一直崩溃。我是新手,谁能帮我解决这个问题?我的 prisma.service.ts:

import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
  async onModuleInit() {
    await this.$connect();
  }

  async enableShutdownHooks(app: INestApplication) {
    this.$on('beforeExit', async () => {
      await app.close();
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

我的主要.ts:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { PrismaService } from './prisma.service';
import { ValidationPipe } from '@nestjs/common';
import helmet from 'helmet';

async function bootstrap() …
Run Code Online (Sandbox Code Playgroud)

nestjs prisma

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

错误 [ExceptionHandler] 无法读取 NestJs 中未定义的属性“__guards__”

我正在努力在 Nest 项目中实现简单的身份验证。

当我添加

@UseGuards(AuthGuard('local'))
Run Code Online (Sandbox Code Playgroud)

我的控制器出现以下错误:

ERROR [ExceptionHandler] Cannot read property '__guards__' of undefined
 at /home/cedric/Bureau/programmation/project_bank/project/node_modules/@nestjs/core/scanner.js:147:152
Run Code Online (Sandbox Code Playgroud)

我遵循所有 Nest 官方文档来执行此操作。

我的控制器是

  @UseGuards(AuthGuard('local'))
  @Post('login')
  async login(@Request() req) {
    console.log(req.body.username);
    return req.body.username;
  }
Run Code Online (Sandbox Code Playgroud)

和我的 auth.guard.ts

@Injectable()
export class LocalAuthGuard extends AuthGuard('local') {}
Run Code Online (Sandbox Code Playgroud)

authentication typescript passport.js nestjs

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