我有一个nestjs暴露一些 RESTAPI的应用程序。其中一个APIs 触发处理某些任务的作业。问题在于,当作业被触发时,应用程序停止服务 REST 请求,这会导致负载均衡器的运行状况检查失败。我按照自述文件末尾给出的方法启动一个单独的子进程来处理作业。但是,该作业不会在子进程中启动,并且API请求会停止。
这是我的工作:
import {
BullQueueEvents,
OnQueueActive,
OnQueueEvent,
Process,
Processor,
} from 'nest-bull';
import { Job } from 'bull';
import { Logger } from '@nestjs/common';
import { AService } from './a-service';
import { AJobInterface } from '../AJobInterface';
@Processor({ name: 'a_queue' })
export class AJob {
private readonly logger = new Logger('AQueue');
constructor(private readonly service: AService) {}
@Process({
name: 'app',
concurrency: 1
})
processApp(job: Job<AJobInterface>) {
console.log('CHILD: ', …Run Code Online (Sandbox Code Playgroud) 我使用带有 TypeORM 的 NestJs 创建了一个 REST API。基本上这是我的用户实体
@Entity('User')
export class User extends BaseEntity {
@PrimaryGeneratedColumn()
public id: number;
@Column({ unique: true })
public username: string;
public passwordHash: string;
}
Run Code Online (Sandbox Code Playgroud)
当从数据库中获取用户时,敏感的密码信息也会被返回。但我只需要登录过程的密码字段。因此,在调用登录服务时,我将数据库用户的密码哈希值与客户端提供的密码进行比较。我永远不想将密码信息返回给客户端。
由于您可以想象从数据库中获取用户的情况经常发生,因此您必须经常从用户对象中删除密码信息。
假设您有一个组实体并且它们之间存在关系。在获取与组相关的用户时,您还必须注意组域中的敏感数据。
也许一些用户深深地嵌套在一个大 SQL 查询语句返回的对象中。有没有办法可以“隐藏”某些字段?打电话时,this.usersRepository.find()我会得到一个用户列表,每个用户都有一个id和一个username字段,但没有一个passwordHash字段。这会让事情变得更容易,因为我只需要在我的signIn流中获取哈希字段。
I have a UserRepository which handles creating/authenticating users infront of the database. I want to perform hashing & validation for the user's password, so I created a seperate service for that purpose, trying to follow single repsonsibility principle, which is declared like this:
@Injectable()
export default class HashService
Run Code Online (Sandbox Code Playgroud)
And I import it in my module:
@Module({
imports: [TypeOrmModule.forFeature([UserRepository])],
controllers: [AuthController],
providers: [AuthService, HashService],
})
export class AuthModule {}
Run Code Online (Sandbox Code Playgroud)
I wish to inject it into UserRepository, I tried passing in …
我有两个实体:User和Habit。一个用户可以创建多个习惯,因此我在用户上使用OneToMany关系(分别在习惯上使用ManyToOne)。
import {Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, BeforeInsert, BeforeUpdate, OneToMany} from "typeorm";
import * as bcrypt from "bcryptjs";
import { Habit } from "../habits/habits.entity";
@Entity()
export class User {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column()
name: string;
@Column()
email: string;
@Column()
password: string;
@OneToMany(type => Habit, habit => habit.author)
habits: Habit[];
@CreateDateColumn()
dateCreated: Date;
@UpdateDateColumn()
dateUpdated: Date;
@BeforeInsert()
@BeforeUpdate()
async hashPassword(): Promise<void> {
this.password = await bcrypt.hash(this.password,10);
}
async comparePassword(password: string): Promise<boolean> { …Run Code Online (Sandbox Code Playgroud) 我的“AppState”枚举具有以下可能的枚举值:
export enum AppState {
SUCCESS,
ERROR,
RUNNING
}
Run Code Online (Sandbox Code Playgroud)
我有一个UpdateAppStateDTO,appState它应该接受除RUNNING之外的每个枚举值。
export class UpdateAppStateDTO {
@IsEnum(AppState)
@NotEquals(AppState.RUNNING) // Doesn't work properly
public appState: AppState;
}
Run Code Online (Sandbox Code Playgroud)
对于路线我有这个例子
@Patch()
public setState(@Body() { appState }: UpdateAppStateDTO): void {
console.log(appState);
}
Run Code Online (Sandbox Code Playgroud)
如果请求有一个空的正文或一个无效的枚举值,比如“foobar”,appState因为我得到了 400,这很好。
问题是当我发送“RUNNING”时,我仍然得到 200 而不是 400。
我怎样才能防止这种行为?
假设我想用猫鼬构建以下架构:
const userSchema = new Schema({
name: {
firstName: String,
lastName: String
}
})
Run Code Online (Sandbox Code Playgroud)
如何使用 NestJS 装饰器 ( @Schema()& @Prop()) 来实现?
我尝试这种方法,但没有运气:
@Schema()
class Name {
@Prop()
firstName: string;
@Prop()
lastName: string;
}
@Schema()
class User extends Document {
@Prop({ type: Name })
name: Name;
}
Run Code Online (Sandbox Code Playgroud)
我也不想使用该raw()方法。
我已经在 Nestjs 中编写了身份验证路由,并希望将它与表单数据一起使用。我让它与 URL-encoded-form-data、JSON、文本一起工作,但是当我使用表单数据时没有在正文中收到任何东西,并且真的希望它像在前端一样使用表单数据我正在点击带有表单数据的路由。我已经尝试了所有可以在网络上找到的方法,但在这种情况下,没有一种方法对我有帮助。所以经过数小时的搜索和尝试,当我没有得到任何线索时,我在这里发布了我的问题。任何形式的帮助表示赞赏。
我的后端 API 使用 NestJS、TypeORM 和 GraphQL。我收到以下错误:
GraphQLError [Object]: Query root type must be provided.
at SchemaValidationContext.reportError (/home/wise-introvert/Container/Projects/the-notebook/app/server/node_modules/graphql/type/validate.js:88:19)
at validateRootTypes (/home/wise-introvert/Container/Projects/the-notebook/app/server/node_modules/graphql/type/validate.js:107:13)
at validateSchema (/home/wise-introvert/Container/Projects/the-notebook/app/server/node_modules/graphql/type/validate.js:52:3)
at graphqlImpl (/home/wise-introvert/Container/Projects/the-notebook/app/server/node_modules/graphql/graphql.js:79:62)
at /home/wise-introvert/Container/Projects/the-notebook/app/server/node_modules/graphql/graphql.js:28:59
at new Promise (<anonymous>)
at Object.graphql (/home/wise-introvert/Container/Projects/the-notebook/app/server/node_modules/graphql/graphql.js:26:10)
at GraphQLSchemaFactory.<anonymous> (/home/wise-introvert/Container/Projects/the-notebook/app/server/node_modules/@nestjs/graphql/dist/schema-builder/graphql-schema.factory.js:49:52)
at Generator.next (<anonymous>)
at /home/wise-introvert/Container/Projects/the-notebook/app/server/node_modules/tslib/tslib.js:114:75
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮我吗。我的仓库:https : //github.com/wise-introvert/nestjs-graphql-api.git
我正在尝试设置我的 graphql resover 来处理一组对象,但无法配置 @Args 装饰器。
我创建了自己的 ArgsType
import { ArgsType, Field, Int, ObjectType } from '@nestjs/graphql';
@ArgsType() // to be used as type in the resolver
@ObjectType() // for schema generation
export class Club {
@Field(type => String)
president: string;
@Field(type => Int)
members?: number;
}
Run Code Online (Sandbox Code Playgroud)
添加单个俱乐部的解析器工作正常!
@Query(() => Int)
async addClub(@Args() club: Club) {
// handle stuff
}
Run Code Online (Sandbox Code Playgroud)
但如果我想像这样提供一系列俱乐部
@Query(() => Int)
async addClubs(@Args({name: 'clubs', type: () => [Club]}) clubs: Array<Club>) {
// handle stuff
}
Run Code Online (Sandbox Code Playgroud)
这在 Nest …
我正在尝试将 Swagger 添加到我的 Nestjs 应用程序中。当我试图编译它时,会抛出找不到模块的错误。我使用 Nestjs 文档中的相同代码。这是我的 main.ts:
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const config = new DocumentBuilder()
.setTitle('Cats example')
.setDescription('The cats API description')
.setVersion('1.0')
.addTag('cats')
.build();
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, document);
await app.listen(3000);
}
bootstrap();
Run Code Online (Sandbox Code Playgroud)
这是错误:
internal/modules/cjs/loader.js:883
throw err;
^
Error: Cannot find module '@nestjs/core/router/route-path-factory'
Require stack:
- D:\BK\solidity\MVPApp\blockchain\back-end-student-wallet-v2\node_modules\@nestjs\swagger\dist\swagger-explorer.js
- D:\BK\solidity\MVPApp\blockchain\back-end-student-wallet-v2\node_modules\@nestjs\swagger\dist\swagger-scanner.js
- D:\BK\solidity\MVPApp\blockchain\back-end-student-wallet-v2\node_modules\@nestjs\swagger\dist\swagger-module.js
- D:\BK\solidity\MVPApp\blockchain\back-end-student-wallet-v2\node_modules\@nestjs\swagger\dist\index.js
- D:\BK\solidity\MVPApp\blockchain\back-end-student-wallet-v2\node_modules\@nestjs\swagger\index.js
- D:\BK\solidity\MVPApp\blockchain\back-end-student-wallet-v2\dist\main.js
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
at Function.Module._load (internal/modules/cjs/loader.js:725:27)
Run Code Online (Sandbox Code Playgroud)
我正在使用 Node 14.15.1,@nestjs/swagger 5.0.0,swagger-ui-express:4.1.6
nestjs ×10
typescript ×6
typeorm ×4
graphql ×2
node.js ×2
body-parser ×1
bull.js ×1
javascript ×1
mongodb ×1
mongoose ×1
nrwl-nx ×1
postgresql ×1
req ×1
swagger ×1
swagger-ui ×1