NestJS
и вот к чему я смог прийти: Nest
), которые нужны по всему проекту я кладу в папку common
, примерами таких модулей могут служить некоторые DTO; сущности/модели; глобальные гарды и тд;/src
, но, например, у меня на работе в проекте все модули лежат в папке modules
, что, в принципе, тоже неплохо.auth
находятся папки: dto
, services
(если в модуле больше одного сервиса, то я создаю для них отдельную папку), если сервис один, то кладу его в корень папки модуля.Auth
), который будет делать вам токены.snake-case
. Примеры: email-confirmation.service.ts
, update-user.dto.ts
. То же самое относится и к директориям. Request
и Response
в GraphQL
, вы должны добавить эту строчку в конфигурацию GraphQLModule
.GraphQLModule.forRoot({
autoSchemaFile: join(process.cwd(), 'src/schema/gql'),
sortSchema: true,
driver: ApolloDriver,
context: ({ req, res }) => ({ req, res }), // <-----
})
CORS
в GraphQL
включается по-другому.@Global()
@Module({
imports: [
ConfigModule.forRoot({}),
JwtModule.registerAsync({})
Reflector,
],
providers: [ConfigService, JwtService, Reflector],
exports: [ConfigService, JwtService, Reflector],
})
export class CommonModule {}
req.authService
? Вместо req
должен быть this
так-то.@Public
и помечать ими те эндпоинты, которые не требуют аутентификации./auth/login
? Выберите что-то одно.authService
как readonly
. delete admin.password
, вместо этого воспользуйтесь class-transformer
и SerializerInterceptor
как тут.nestjs-typegoose
устарел и больше не поддерживается. Более того, там есть один критический недостаток. Я сделал свою обёртку для Typegoose в рамках NestJS.У меня есть ссылка вида example.ru/mail/confirm?token=123
?token
- это query параметр, а не обычный, который идет после /
@Get('mail/confirm/:token')
либо вместо @Param()
используйте @Query()
exports: []
@Module({
imports: [
TypeOrmModule.forFeature([UserEntity, ForgotEntity]),
],
controllers: [UserController],
providers: [UserService],
exports: [UserService] // Экспортируем зависимости данного модуля.
})
export class UserModule{}
@Module({
imports: [
TypeOrmModule.forFeature([PaymentsEntity]),
UserModule // Импортируем его сдесь. Теперь в пределах данного модуля нам доступен UserService.
],
controllers: [PurchaseController],
providers: [PurchaseService]
})
export class PurchaseModule {}
/items
@Controller('/items')
getAll
, и делаете это с помощью декоратора @Response, но в Nest, как только вы получаете доступ к объекту ответа, всё управление ответом передаётся вам, а значит вы должны вызвать res.end()
или res.json()
чтобы завершить запрос.@Param
, а параметры это вообще про другое — вам нужен @Body()