我 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)
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)
import { App } from './entities/app';
import { appDataSource } from …Run Code Online (Sandbox Code Playgroud) 我在使用 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)
解决办法有哪些?
所以我已经使用 docker-compose 在 NestJS 和 Docker 上开发这个后端大约 6 个月了,但从来没有遇到过我的 docker 不监听我的文件更改的问题。几天前,这种情况开始发生,我不知道为什么。
\n这是我的 Dockerfile
\nFROM 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"]\nRun Code Online (Sandbox Code Playgroud)\n这是我的 docker-compose 文件
\nservices:\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\nRun Code Online (Sandbox Code Playgroud)\n这是我的 package.json,其中包含启动我的项目的脚本
\n"scripts": {\n "prebuild": "rimraf dist",\n "build": "nest …Run Code Online (Sandbox Code Playgroud) 我尝试使用 JWT 在 NestJS API 中对用户进行身份验证,但总是收到相同的错误:未经授权 401。
在我告诉你我的调查结果是空的之前,让我向你展示我的代码:
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) 这是我的装饰师
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 装饰器中访问响应数据呢?
我有一个名为 的控制器User和两个服务类:UserAdminService和UserSuperAdminService。当用户向控制器的任何端点发出请求时User,我想检查发出请求的用户是管理员还是超级管理员(基于令牌中的角色)并实例化正确的服务(UserAdminService或UserSuperAdminService)。请注意,这两个服务实现相同的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 解决服务依赖关系。有任何想法吗?
使用 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) 我有以下 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 应用程序中我想接收类属性列表,以便我可以动态生成模型表单。
我试图在我的 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) 我正在努力在 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) nestjs ×10
typescript ×4
javascript ×3
node.js ×2
passport.js ×2
prisma ×2
datasource ×1
docker ×1
file-upload ×1
jwt ×1
multer ×1
passport-jwt ×1
postgresql ×1
typeorm ×1