From a461b327b5f2d5d9a3654967e42f36bb34be3c88 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 20:58:37 +0800 Subject: [PATCH 01/37] =?UTF-8?q?=E7=94=9F=E6=88=90demo=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/middleware/demo.middleware.spec.ts | 7 +++++++ src/core/middleware/demo.middleware.ts | 8 ++++++++ 2 files changed, 15 insertions(+) create mode 100644 src/core/middleware/demo.middleware.spec.ts create mode 100644 src/core/middleware/demo.middleware.ts diff --git a/src/core/middleware/demo.middleware.spec.ts b/src/core/middleware/demo.middleware.spec.ts new file mode 100644 index 0000000..b2672f0 --- /dev/null +++ b/src/core/middleware/demo.middleware.spec.ts @@ -0,0 +1,7 @@ +import { DemoMiddleware } from './demo.middleware'; + +describe('DemoMiddleware', () => { + it('should be defined', () => { + expect(new DemoMiddleware()).toBeDefined(); + }); +}); diff --git a/src/core/middleware/demo.middleware.ts b/src/core/middleware/demo.middleware.ts new file mode 100644 index 0000000..c64b262 --- /dev/null +++ b/src/core/middleware/demo.middleware.ts @@ -0,0 +1,8 @@ +import { Injectable, NestMiddleware } from '@nestjs/common'; + +@Injectable() +export class DemoMiddleware implements NestMiddleware { + use(req: any, res: any, next: () => void) { + next(); + } +} From 5b437f97041563e50c6aaa804efcc92655fc5da6 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 21:01:46 +0800 Subject: [PATCH 02/37] =?UTF-8?q?=E7=94=9F=E6=88=90=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=EF=BC=8Cdemo=EF=BC=8Cnest=20generate=20service=20demo=20posts/?= =?UTF-8?q?providers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.module.ts | 3 ++- src/posts/providers/demo/demo.service.spec.ts | 18 ++++++++++++++++++ src/posts/providers/demo/demo.service.ts | 4 ++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/posts/providers/demo/demo.service.spec.ts create mode 100644 src/posts/providers/demo/demo.service.ts diff --git a/src/app.module.ts b/src/app.module.ts index 563c676..db9f600 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -2,10 +2,11 @@ import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { PostsController } from './posts/posts.controller'; +import { DemoService } from './posts/providers/demo/demo.service'; @Module({ imports: [], controllers: [AppController, PostsController], - providers: [AppService], + providers: [AppService, DemoService], }) export class AppModule {} diff --git a/src/posts/providers/demo/demo.service.spec.ts b/src/posts/providers/demo/demo.service.spec.ts new file mode 100644 index 0000000..552dbbd --- /dev/null +++ b/src/posts/providers/demo/demo.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { DemoService } from './demo.service'; + +describe('DemoService', () => { + let service: DemoService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [DemoService], + }).compile(); + + service = module.get(DemoService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/posts/providers/demo/demo.service.ts b/src/posts/providers/demo/demo.service.ts new file mode 100644 index 0000000..3adc13f --- /dev/null +++ b/src/posts/providers/demo/demo.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class DemoService {} From 1f15a00a2223da95d667981726c566b9cfd77dd4 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 21:06:28 +0800 Subject: [PATCH 03/37] =?UTF-8?q?=E7=94=9F=E6=88=90=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8Cpost=20interface=EF=BC=8Cnest=20gene?= =?UTF-8?q?rate=20interface=20post=20posts/interfaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/posts/interfaces/post.interface.ts | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/posts/interfaces/post.interface.ts diff --git a/src/posts/interfaces/post.interface.ts b/src/posts/interfaces/post.interface.ts new file mode 100644 index 0000000..5200a8f --- /dev/null +++ b/src/posts/interfaces/post.interface.ts @@ -0,0 +1 @@ +export interface Post {} From c3192052152df34e2252c7835ee2bed1f9b04a79 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 21:12:12 +0800 Subject: [PATCH 04/37] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=9A=82=E5=8F=AA?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=AD=97=E6=AE=B5=EF=BC=8Ctitle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/posts/interfaces/post.interface.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/posts/interfaces/post.interface.ts b/src/posts/interfaces/post.interface.ts index 5200a8f..991c559 100644 --- a/src/posts/interfaces/post.interface.ts +++ b/src/posts/interfaces/post.interface.ts @@ -1 +1,3 @@ -export interface Post {} +export interface Post { + title: string +} From b56361bfadb6e62a1a57c84913636f9502fc6d86 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 21:12:44 +0800 Subject: [PATCH 05/37] =?UTF-8?q?=E5=BC=95=E5=85=A5Post=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=BB=BA=E4=B8=A4=E4=B8=AA=E6=96=B9=E6=B3=95=EF=BC=9AfindAll?= =?UTF-8?q?=EF=BC=8Ccreate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/posts/providers/demo/demo.service.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/posts/providers/demo/demo.service.ts b/src/posts/providers/demo/demo.service.ts index 3adc13f..5735da6 100644 --- a/src/posts/providers/demo/demo.service.ts +++ b/src/posts/providers/demo/demo.service.ts @@ -1,4 +1,15 @@ import { Injectable } from '@nestjs/common'; +import { Post } from 'src/posts/interfaces/post.interface'; @Injectable() -export class DemoService {} +export class DemoService { + private readonly posts: Post[] = []; + + findAll(): Post[] { + return this.posts; + } + + create(post: Post) { + this.posts.push(post); + } +} From 4ee0b7210b6609c543c902b32d00d49629b50d33 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 21:23:43 +0800 Subject: [PATCH 06/37] =?UTF-8?q?=E6=8A=8A=E6=9C=8D=E5=8A=A1=E7=9A=84DemoS?= =?UTF-8?q?ervice=E5=BC=95=E5=85=A5=E5=88=B0controller=E6=9D=A5=EF=BC=8Cge?= =?UTF-8?q?t=E8=B7=AF=E7=94=B1=E5=AF=B9=E5=BA=94findAll=EF=BC=8Cpost?= =?UTF-8?q?=E5=AF=B9=E5=BA=94create=EF=BC=8C=E6=9A=82=E6=97=B6=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E4=B8=B4=E6=97=B6=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/posts/posts.controller.ts | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/posts/posts.controller.ts b/src/posts/posts.controller.ts index e51b874..515550f 100644 --- a/src/posts/posts.controller.ts +++ b/src/posts/posts.controller.ts @@ -1,17 +1,20 @@ import { Controller, Get, Post, Req, Query, Headers, Param, Body } from '@nestjs/common'; import { CreatePostDto } from './post.dto'; +import { DemoService } from './providers/demo/demo.service' + @Controller('posts') export class PostsController { + private readonly demoService; + + constructor(demoService: DemoService) { + this.demoService = demoService + } + + @Get() - index(@Headers('authorization') headers, @Query() query) { - console.log(headers) - console.log(query) - return [ - { - title: 'hello ~' - } - ] + index() { + return this.demoService.findAll(); } @Get(':id') @@ -23,7 +26,6 @@ export class PostsController { @Post() store(@Body() post: CreatePostDto) { - console.log(post) - return post + this.demoService.create(post); } } From 71a16606db779a9c6f085dd9d1685a3f438651c2 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 21:27:42 +0800 Subject: [PATCH 07/37] =?UTF-8?q?=E6=9B=B4=E5=8A=A0=E7=AE=80=E4=BE=BF?= =?UTF-8?q?=E7=9A=84=E6=B3=A8=E5=85=A5=E6=96=B9=E6=B3=95=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E7=94=A8=E4=BA=8B=E5=85=88=E5=A3=B0=E6=98=8E=E5=8F=8A=E4=BD=BF?= =?UTF-8?q?=E7=94=A8this=E6=9D=A5=E8=B5=8B=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/posts/posts.controller.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/posts/posts.controller.ts b/src/posts/posts.controller.ts index 515550f..57096e5 100644 --- a/src/posts/posts.controller.ts +++ b/src/posts/posts.controller.ts @@ -5,12 +5,8 @@ import { DemoService } from './providers/demo/demo.service' @Controller('posts') export class PostsController { - private readonly demoService; - - constructor(demoService: DemoService) { - this.demoService = demoService - } + constructor(private readonly demoService: DemoService) {} @Get() index() { From bf25cd7eaa65183799544600b87a69cbf8aba130 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 21:50:28 +0800 Subject: [PATCH 08/37] =?UTF-8?q?=E5=B0=86posts=E8=BD=AC=E4=B8=BA=E4=B8=80?= =?UTF-8?q?=E4=B8=AAmodule=EF=BC=9B=E5=85=88=E5=BB=BA=E4=B8=AAnest=20gener?= =?UTF-8?q?ate=20module=20posts=EF=BC=8C=E7=84=B6=E5=90=8E=E6=8A=8Aposts?= =?UTF-8?q?=E6=95=B4=E4=B8=AA=E6=94=BE=E5=88=B0modules=E9=87=8C=E9=9D=A2?= =?UTF-8?q?=E5=8E=BB=EF=BC=8C=E6=8A=8Acontroller=E5=92=8Cprovider=E6=94=B6?= =?UTF-8?q?=E7=B4=A7=E5=88=B0posts=20module=E9=87=8C=E9=9D=A2=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.module.ts | 9 ++++----- src/{ => modules}/posts/interfaces/post.interface.ts | 0 src/{ => modules}/posts/post.dto.ts | 0 src/{ => modules}/posts/posts.controller.spec.ts | 0 src/{ => modules}/posts/posts.controller.ts | 0 src/modules/posts/posts.module.ts | 9 +++++++++ .../posts/providers/demo/demo.service.spec.ts | 0 src/{ => modules}/posts/providers/demo/demo.service.ts | 2 +- 8 files changed, 14 insertions(+), 6 deletions(-) rename src/{ => modules}/posts/interfaces/post.interface.ts (100%) rename src/{ => modules}/posts/post.dto.ts (100%) rename src/{ => modules}/posts/posts.controller.spec.ts (100%) rename src/{ => modules}/posts/posts.controller.ts (100%) create mode 100644 src/modules/posts/posts.module.ts rename src/{ => modules}/posts/providers/demo/demo.service.spec.ts (100%) rename src/{ => modules}/posts/providers/demo/demo.service.ts (78%) diff --git a/src/app.module.ts b/src/app.module.ts index db9f600..68590ae 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,12 +1,11 @@ import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; -import { PostsController } from './posts/posts.controller'; -import { DemoService } from './posts/providers/demo/demo.service'; +import { PostsModule } from './modules/posts/posts.module'; @Module({ - imports: [], - controllers: [AppController, PostsController], - providers: [AppService, DemoService], + imports: [PostsModule], + controllers: [AppController], + providers: [AppService], }) export class AppModule {} diff --git a/src/posts/interfaces/post.interface.ts b/src/modules/posts/interfaces/post.interface.ts similarity index 100% rename from src/posts/interfaces/post.interface.ts rename to src/modules/posts/interfaces/post.interface.ts diff --git a/src/posts/post.dto.ts b/src/modules/posts/post.dto.ts similarity index 100% rename from src/posts/post.dto.ts rename to src/modules/posts/post.dto.ts diff --git a/src/posts/posts.controller.spec.ts b/src/modules/posts/posts.controller.spec.ts similarity index 100% rename from src/posts/posts.controller.spec.ts rename to src/modules/posts/posts.controller.spec.ts diff --git a/src/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts similarity index 100% rename from src/posts/posts.controller.ts rename to src/modules/posts/posts.controller.ts diff --git a/src/modules/posts/posts.module.ts b/src/modules/posts/posts.module.ts new file mode 100644 index 0000000..b329793 --- /dev/null +++ b/src/modules/posts/posts.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { PostsController } from './posts.controller'; +import { DemoService } from "./providers/demo/demo.service"; + +@Module({ + controllers: [PostsController], + providers: [DemoService] +}) +export class PostsModule {} diff --git a/src/posts/providers/demo/demo.service.spec.ts b/src/modules/posts/providers/demo/demo.service.spec.ts similarity index 100% rename from src/posts/providers/demo/demo.service.spec.ts rename to src/modules/posts/providers/demo/demo.service.spec.ts diff --git a/src/posts/providers/demo/demo.service.ts b/src/modules/posts/providers/demo/demo.service.ts similarity index 78% rename from src/posts/providers/demo/demo.service.ts rename to src/modules/posts/providers/demo/demo.service.ts index 5735da6..0168854 100644 --- a/src/posts/providers/demo/demo.service.ts +++ b/src/modules/posts/providers/demo/demo.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { Post } from 'src/posts/interfaces/post.interface'; +import { Post } from 'src/modules/posts/interfaces/post.interface'; @Injectable() export class DemoService { From 41e876acd695e6a2f6fc56e0dfea41f0880f6515 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 22:07:12 +0800 Subject: [PATCH 09/37] =?UTF-8?q?=E6=8A=8A=E4=B8=AD=E9=97=B4=E4=BB=B6?= =?UTF-8?q?=E7=94=A8=E8=B5=B7=E6=9D=A5=EF=BC=9A=E4=B8=AD=E9=97=B4=E4=BB=B6?= =?UTF-8?q?=E6=98=AF=E4=B8=89=E5=8F=82=E6=95=B0=E5=B7=A5=E5=85=B7=EF=BC=8C?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E9=9C=80=E8=A6=81=E4=BF=AE=E6=94=B9AppModule?= =?UTF-8?q?=E7=9A=84configure=EF=BC=8C=E5=8A=A0=E5=85=A5consumer=E6=9D=A5a?= =?UTF-8?q?pply=E5=92=8CforRoutes=EF=BC=8C=E8=BF=99=E9=87=8C=E5=BA=94?= =?UTF-8?q?=E8=AF=A5=E6=98=AF=E5=8F=AF=E4=BB=A5=E7=BB=99=E6=95=B0=E7=BB=84?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E6=9D=A5=E5=AF=B9=E5=A4=9A=E4=B8=AA=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E8=BF=9B=E8=A1=8C=E5=A4=84=E7=90=86=E5=90=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.module.ts | 9 +++++++-- src/core/middleware/demo.middleware.ts | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index 68590ae..5214add 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,11 +1,16 @@ -import { Module } from '@nestjs/common'; +import { Module, NestModule, MiddlewareConsumer} from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { PostsModule } from './modules/posts/posts.module'; +import { DemoMiddleware } from './core/middleware/demo.middleware' @Module({ imports: [PostsModule], controllers: [AppController], providers: [AppService], }) -export class AppModule {} +export class AppModule implements NestModule { + configure(consumer: MiddlewareConsumer) { + consumer.apply(DemoMiddleware).forRoutes('posts') + } +} diff --git a/src/core/middleware/demo.middleware.ts b/src/core/middleware/demo.middleware.ts index c64b262..18c0a06 100644 --- a/src/core/middleware/demo.middleware.ts +++ b/src/core/middleware/demo.middleware.ts @@ -3,6 +3,7 @@ import { Injectable, NestMiddleware } from '@nestjs/common'; @Injectable() export class DemoMiddleware implements NestMiddleware { use(req: any, res: any, next: () => void) { + console.log('hello ~') next(); } } From dcece6ecdb591e4f2f4ad489b674d4906694310a Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 22:15:05 +0800 Subject: [PATCH 10/37] =?UTF-8?q?=E6=89=8B=E5=B7=A5=E6=8A=9B=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=BC=82=E5=B8=B8=E5=87=BA=E6=9D=A5=E7=9C=8B=E7=9C=8B?= =?UTF-8?q?=EF=BC=8C{=20=20=20=20=20"error":=20"Forbidden",=20=20=20=20=20?= =?UTF-8?q?"message":=20"=E6=B2=A1=E6=9C=89=E6=9D=83=E9=99=90=EF=BC=81",?= =?UTF-8?q?=20=20=20=20=20"statusCode":=20403=20}=EF=BC=8C=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E5=AF=B9=E8=B1=A1=E6=AF=94=E6=99=AE=E9=80=9A=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E5=A4=9A=E8=BF=94=E5=9B=9E=E4=B8=80=E4=B8=AAerror?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/posts/posts.controller.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index 57096e5..b02d197 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Post, Req, Query, Headers, Param, Body } from '@nestjs/common'; +import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException } from '@nestjs/common'; import { CreatePostDto } from './post.dto'; import { DemoService } from './providers/demo/demo.service' @@ -22,6 +22,8 @@ export class PostsController { @Post() store(@Body() post: CreatePostDto) { - this.demoService.create(post); + // throw new HttpException('没有权限!', HttpStatus.FORBIDDEN) + throw new ForbiddenException('没有权限!') + // this.demoService.create(post); } } From 7aea5a1308449b0759b8f408813b17061ff4f183 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 22:17:14 +0800 Subject: [PATCH 11/37] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E8=BF=87=E6=BB=A4=E5=99=A8=EF=BC=8C=E7=94=A8?= =?UTF-8?q?=E6=9D=A5=E5=A4=84=E7=90=86=E5=BC=82=E5=B8=B8=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8Cnest=20generate=20filter=20demo=20co?= =?UTF-8?q?re/filters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/filters/demo.filter.spec.ts | 7 +++++++ src/core/filters/demo.filter.ts | 6 ++++++ 2 files changed, 13 insertions(+) create mode 100644 src/core/filters/demo.filter.spec.ts create mode 100644 src/core/filters/demo.filter.ts diff --git a/src/core/filters/demo.filter.spec.ts b/src/core/filters/demo.filter.spec.ts new file mode 100644 index 0000000..2341e9f --- /dev/null +++ b/src/core/filters/demo.filter.spec.ts @@ -0,0 +1,7 @@ +import { DemoFilter } from './demo.filter'; + +describe('DemoFilter', () => { + it('should be defined', () => { + expect(new DemoFilter()).toBeDefined(); + }); +}); diff --git a/src/core/filters/demo.filter.ts b/src/core/filters/demo.filter.ts new file mode 100644 index 0000000..85beef8 --- /dev/null +++ b/src/core/filters/demo.filter.ts @@ -0,0 +1,6 @@ +import { ArgumentsHost, Catch, ExceptionFilter } from '@nestjs/common'; + +@Catch() +export class DemoFilter implements ExceptionFilter { + catch(exception: T, host: ArgumentsHost) {} +} From 0e349316f85a26ca772bfda0df9397ce69ada67b Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 22:24:11 +0800 Subject: [PATCH 12/37] =?UTF-8?q?=E7=84=B6=E5=90=8E=E6=8A=8A=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E5=AE=9A=E4=B9=89=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/filters/demo.filter.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/core/filters/demo.filter.ts b/src/core/filters/demo.filter.ts index 85beef8..d6c8195 100644 --- a/src/core/filters/demo.filter.ts +++ b/src/core/filters/demo.filter.ts @@ -1,6 +1,16 @@ -import { ArgumentsHost, Catch, ExceptionFilter } from '@nestjs/common'; +import { ArgumentsHost, Catch, ExceptionFilter, HttpException } from '@nestjs/common'; -@Catch() +@Catch(HttpException) export class DemoFilter implements ExceptionFilter { - catch(exception: T, host: ArgumentsHost) {} + catch(exception: HttpException, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const request = ctx.getRequest(); + const status = exception.getStatus(); + + response.status(status).json({ + statusCode: status, + path: request.url, + }); + } } From 8ef85cd82eb33be629d76db75e8413f9c7f6f4d8 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 22:41:43 +0800 Subject: [PATCH 13/37] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E4=B8=8A=E4=BA=86?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E7=9A=84filter=E6=9D=A5=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=BC=82=E5=B8=B8=EF=BC=8C=E9=9C=80=E8=A6=81=E6=B3=A8?= =?UTF-8?q?=E6=84=8F=E6=98=AF=E5=BC=95=E5=85=A5filter=E7=9A=84=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BB=8E=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E5=BE=80=E4=B8=8A=E6=89=BE=E4=B8=A4=E5=B1=82=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E5=B0=B1=E5=8F=AF=E4=BB=A5=EF=BC=8C=E5=85=B6=E5=AE=83?= =?UTF-8?q?src=E5=BC=80=E5=A4=B4=E7=9A=84=E7=9B=B8=E5=AF=B9=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E4=B8=8D=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/posts/posts.controller.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index b02d197..6200dfc 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -1,6 +1,7 @@ -import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException } from '@nestjs/common'; +import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException, UseFilters } from '@nestjs/common'; import { CreatePostDto } from './post.dto'; import { DemoService } from './providers/demo/demo.service' +import { DemoFilter } from '../../core/filters/demo.filter' @Controller('posts') @@ -21,6 +22,7 @@ export class PostsController { } @Post() + @UseFilters(DemoFilter) store(@Body() post: CreatePostDto) { // throw new HttpException('没有权限!', HttpStatus.FORBIDDEN) throw new ForbiddenException('没有权限!') From b4306f2cbb71caf79c4af2c170124c2e63c77c33 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 22:43:55 +0800 Subject: [PATCH 14/37] =?UTF-8?q?=E5=88=9A=E6=98=AF=E5=85=B7=E4=BD=93?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E7=9A=84=E6=96=B9=E6=B3=95=E5=B1=82=E9=9D=A2?= =?UTF-8?q?=EF=BC=8C=E4=B9=9F=E5=8F=AF=E4=BB=A5=E6=94=BE=E5=88=B0=E6=95=B4?= =?UTF-8?q?=E4=B8=AA=E4=B8=BB=E8=B7=AF=E7=94=B1=E6=8E=A7=E5=88=B6=E5=99=A8?= =?UTF-8?q?=E5=B1=82=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/posts/posts.controller.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index 6200dfc..785f5be 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -5,6 +5,7 @@ import { DemoFilter } from '../../core/filters/demo.filter' @Controller('posts') +@UseFilters(DemoFilter) export class PostsController { constructor(private readonly demoService: DemoService) {} @@ -22,7 +23,7 @@ export class PostsController { } @Post() - @UseFilters(DemoFilter) + // @UseFilters(DemoFilter) store(@Body() post: CreatePostDto) { // throw new HttpException('没有权限!', HttpStatus.FORBIDDEN) throw new ForbiddenException('没有权限!') From c9565708055c335b20f4b98ebceaf3504e73d622 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Tue, 18 Jun 2019 22:48:25 +0800 Subject: [PATCH 15/37] =?UTF-8?q?=E7=94=9A=E8=87=B3=E6=98=AF=E5=90=A7filte?= =?UTF-8?q?r=E4=BD=BF=E7=94=A8=E5=88=B0app=E7=9A=84=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E5=8E=BB=EF=BC=8C=E6=8C=89=E7=90=86=E4=B8=80=E8=88=AC=E5=BA=94?= =?UTF-8?q?=E8=AF=A5=E6=98=AF=E4=BC=9A=E5=9C=A8=E5=85=A8=E5=B1=80=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=9A=84=EF=BC=8C=E4=B8=8D=E8=BF=87=E5=A4=9A=E4=BA=BA?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E4=BB=A5=E5=8F=8A=E4=B8=8D=E5=90=8C=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=A8=A1=E5=9D=97=E4=BC=9A=E6=9C=89=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=9A=84=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=E4=B9=9F?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 2 ++ src/modules/posts/posts.controller.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 13cad38..cac5271 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,8 +1,10 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; +import { DemoFilter } from './core/filters/demo.filter' async function bootstrap() { const app = await NestFactory.create(AppModule); + app.useGlobalFilters(new DemoFilter()); await app.listen(3000); } bootstrap(); diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index 785f5be..5352b0c 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -5,7 +5,7 @@ import { DemoFilter } from '../../core/filters/demo.filter' @Controller('posts') -@UseFilters(DemoFilter) +// @UseFilters(DemoFilter) export class PostsController { constructor(private readonly demoService: DemoService) {} From fee353b81f4f922a3585ad3a47b0c25cbc0154ee Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 21:21:32 +0800 Subject: [PATCH 16/37] =?UTF-8?q?=E5=AE=89=E8=A3=85=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E4=B8=8E=E8=BD=AC=E6=8D=A2=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E5=BA=93=EF=BC=8Cyarn=20add=20class-transformer=20class-valida?= =?UTF-8?q?tor=20--save?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 10 ++++++++-- yarn.lock | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4d0eb94..9961e94 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,9 @@ "dependencies": { "@nestjs/common": "^6.0.0", "@nestjs/core": "^6.0.0", - "@nestjs/platform-express": "^6.0.0", + "@nestjs/platform-express": "^6.0.0", + "class-transformer": "^0.2.3", + "class-validator": "^0.9.1", "reflect-metadata": "^0.1.12", "rimraf": "^2.6.2", "rxjs": "^6.3.3" @@ -46,7 +48,11 @@ "wait-on": "^3.2.0" }, "jest": { - "moduleFileExtensions": ["js", "json", "ts"], + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], "rootDir": "src", "testRegex": ".spec.ts$", "transform": { diff --git a/yarn.lock b/yarn.lock index b79d114..a5d4dfd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -797,6 +797,11 @@ ci-info@^1.5.0: resolved "https://registry.npm.taobao.org/ci-info/download/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc= +class-transformer@^0.2.3: + version "0.2.3" + resolved "https://registry.npm.taobao.org/class-transformer/download/class-transformer-0.2.3.tgz#598c92ca71dcca73f91ccb875d74a3847ccfa32d" + integrity sha1-WYySynHcynP5HMuHXXSjhHzPoy0= + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -807,6 +812,14 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +class-validator@^0.9.1: + version "0.9.1" + resolved "https://registry.npm.taobao.org/class-validator/download/class-validator-0.9.1.tgz#d60e58c5d14abca0a41bce38cf792ad4c46d1531" + integrity sha1-1g5YxdFKvKCkG844z3kq1MRtFTE= + dependencies: + google-libphonenumber "^3.1.6" + validator "10.4.0" + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.npm.taobao.org/cli-boxes/download/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -1787,6 +1800,11 @@ globals@^9.18.0: resolved "https://registry.npm.taobao.org/globals/download/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo= +google-libphonenumber@^3.1.6: + version "3.2.2" + resolved "https://registry.npm.taobao.org/google-libphonenumber/download/google-libphonenumber-3.2.2.tgz#3d9d7ba727e99a50812f21b0ed313723b76c5c54" + integrity sha1-PZ17pyfpmlCBLyGw7TE3I7dsXFQ= + got@^6.7.1: version "6.7.1" resolved "https://registry.npm.taobao.org/got/download/got-6.7.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgot%2Fdownload%2Fgot-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -4925,6 +4943,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validator@10.4.0: + version "10.4.0" + resolved "https://registry.npm.taobao.org/validator/download/validator-10.4.0.tgz#ee99a44afb3bb5ed350a159f056ca72a204cfc3c" + integrity sha1-7pmkSvs7te01ChWfBWynKiBM/Dw= + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" From 83943ece4359ef5c8b0f9e94bd8779ba5b1bce45 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 21:22:03 +0800 Subject: [PATCH 17/37] =?UTF-8?q?=E7=BB=99post=20dto=20=E7=9A=84=20title?= =?UTF-8?q?=20=E5=8A=A0=E4=B8=8A=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=AA=8C?= =?UTF-8?q?=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/posts/post.dto.ts | 3 +++ src/modules/posts/posts.controller.ts | 7 ++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/modules/posts/post.dto.ts b/src/modules/posts/post.dto.ts index 4783ca3..632f55a 100644 --- a/src/modules/posts/post.dto.ts +++ b/src/modules/posts/post.dto.ts @@ -1,3 +1,6 @@ +import { IsString } from 'class-validator' + export class CreatePostDto { + @IsString() readonly title: string } \ No newline at end of file diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index 5352b0c..056aae9 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException, UseFilters } from '@nestjs/common'; +import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException, UseFilters, UsePipes, ValidationPipe } from '@nestjs/common'; import { CreatePostDto } from './post.dto'; import { DemoService } from './providers/demo/demo.service' import { DemoFilter } from '../../core/filters/demo.filter' @@ -24,9 +24,10 @@ export class PostsController { @Post() // @UseFilters(DemoFilter) + @UsePipes(ValidationPipe) store(@Body() post: CreatePostDto) { // throw new HttpException('没有权限!', HttpStatus.FORBIDDEN) - throw new ForbiddenException('没有权限!') - // this.demoService.create(post); + // throw new ForbiddenException('没有权限!') + this.demoService.create(post); } } From 2566b3375e4beb19b357847a2dcd3a31220fc4d3 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 21:22:36 +0800 Subject: [PATCH 18/37] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=8E=89=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E5=85=A8=E5=B1=80=E7=9A=84=E4=B8=8D=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E7=9A=84=E8=87=AA=E5=AE=9A=E4=B9=89=E9=94=99=E8=AF=AF=E5=A4=84?= =?UTF-8?q?=E7=90=86=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index cac5271..89a5e14 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,7 +4,7 @@ import { DemoFilter } from './core/filters/demo.filter' async function bootstrap() { const app = await NestFactory.create(AppModule); - app.useGlobalFilters(new DemoFilter()); + // app.useGlobalFilters(new DemoFilter()); await app.listen(3000); } bootstrap(); From 8f9ae7d1b92546c4c9719605fc01f6d87fd496be Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 21:31:08 +0800 Subject: [PATCH 19/37] =?UTF-8?q?Params=E9=87=8C=E9=9D=A2=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E5=8A=A0=E6=95=B0=E6=8D=AE=E8=BD=AC=E6=8D=A2pipe?= =?UTF-8?q?=EF=BC=8C=E8=BF=99=E6=A0=B7=E6=8B=BF=E5=88=B0=E7=9A=84=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=80=BC=E5=B0=B1=E4=BC=9A=E6=98=AF=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E8=BF=87=E5=90=8E=E7=9A=84=E3=80=82=E8=BF=99=E4=B8=AA=E5=A5=BD?= =?UTF-8?q?=E5=83=8F=E6=AF=94=E5=9C=A8tornado=E8=87=AA=E5=B7=B1=E5=86=99ge?= =?UTF-8?q?t...=E6=96=B9=E6=B3=95=E8=A6=81=E6=9B=B4=E9=80=9A=E7=94=A8?= =?UTF-8?q?=EF=BC=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/posts/posts.controller.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index 056aae9..adf98ae 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException, UseFilters, UsePipes, ValidationPipe } from '@nestjs/common'; +import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException, UseFilters, UsePipes, ValidationPipe, ParseIntPipe } from '@nestjs/common'; import { CreatePostDto } from './post.dto'; import { DemoService } from './providers/demo/demo.service' import { DemoFilter } from '../../core/filters/demo.filter' @@ -16,9 +16,11 @@ export class PostsController { } @Get(':id') - show(@Param() params) { + show(@Param('id', ParseIntPipe) id) { + console.log('typeof id:', typeof id); + return { - title: `Post ${params.id}` + title: `Post ${id}` } } From d20d72db9a89a821e826f48bbe79511516c95922 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 21:33:11 +0800 Subject: [PATCH 20/37] =?UTF-8?q?guard=EF=BC=8C=E5=AE=88=E5=8D=AB=EF=BC=8C?= =?UTF-8?q?=E8=BA=AB=E4=BB=BD=E9=AA=8C=E8=AF=81=E7=94=A8=E7=9A=84=E5=90=A7?= =?UTF-8?q?=EF=BC=8C=E5=88=9B=E5=BB=BA=E4=B8=80=E4=B8=AA=EF=BC=8Cnest=20ge?= =?UTF-8?q?nerate=20guard=20demoAuth=20core/guards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/guards/demo-auth.guard.spec.ts | 7 +++++++ src/core/guards/demo-auth.guard.ts | 11 +++++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/core/guards/demo-auth.guard.spec.ts create mode 100644 src/core/guards/demo-auth.guard.ts diff --git a/src/core/guards/demo-auth.guard.spec.ts b/src/core/guards/demo-auth.guard.spec.ts new file mode 100644 index 0000000..92f909f --- /dev/null +++ b/src/core/guards/demo-auth.guard.spec.ts @@ -0,0 +1,7 @@ +import { DemoAuthGuard } from './demo-auth.guard'; + +describe('DemoAuthGuard', () => { + it('should be defined', () => { + expect(new DemoAuthGuard()).toBeDefined(); + }); +}); diff --git a/src/core/guards/demo-auth.guard.ts b/src/core/guards/demo-auth.guard.ts new file mode 100644 index 0000000..fdf9d4c --- /dev/null +++ b/src/core/guards/demo-auth.guard.ts @@ -0,0 +1,11 @@ +import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; +import { Observable } from 'rxjs'; + +@Injectable() +export class DemoAuthGuard implements CanActivate { + canActivate( + context: ExecutionContext, + ): boolean | Promise | Observable { + return true; + } +} From 37ab2ebe18120ef10cb8b3718c9b448fbfdbd350 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 21:43:45 +0800 Subject: [PATCH 21/37] =?UTF-8?q?=E5=90=AF=E7=94=A8=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E7=AE=80=E5=8D=95=E7=9A=84=E5=AE=88=E5=8D=AB=EF=BC=8C=E9=AA=8C?= =?UTF-8?q?=E8=AF=81headers=E4=BF=A1=E6=81=AF=E9=87=8C=E9=9D=A2=E6=9C=89?= =?UTF-8?q?=E6=B2=A1=E6=9C=89x-demo=E7=AD=89=E4=BA=8Esecret=E8=BF=99?= =?UTF-8?q?=E4=B8=AA=E5=80=BC=EF=BC=8C=E6=9C=89=E5=B0=B1=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=B0=B1=E4=B8=8D=E9=80=9A=E8=BF=87=E6=8A=A5?= =?UTF-8?q?403?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/guards/demo-auth.guard.ts | 4 +++- src/modules/posts/posts.controller.ts | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/core/guards/demo-auth.guard.ts b/src/core/guards/demo-auth.guard.ts index fdf9d4c..87d47af 100644 --- a/src/core/guards/demo-auth.guard.ts +++ b/src/core/guards/demo-auth.guard.ts @@ -6,6 +6,8 @@ export class DemoAuthGuard implements CanActivate { canActivate( context: ExecutionContext, ): boolean | Promise | Observable { - return true; + const request = context.switchToHttp().getRequest(); + + return request.header('x-demo') === 'secret'; } } diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index adf98ae..83f71ab 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -1,10 +1,12 @@ -import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException, UseFilters, UsePipes, ValidationPipe, ParseIntPipe } from '@nestjs/common'; +import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException, UseFilters, UsePipes, ValidationPipe, ParseIntPipe, UseGuards } from '@nestjs/common'; import { CreatePostDto } from './post.dto'; import { DemoService } from './providers/demo/demo.service' import { DemoFilter } from '../../core/filters/demo.filter' +import { DemoAuthGuard } from '../../core/guards/demo-auth.guard' @Controller('posts') +@UseGuards(DemoAuthGuard) // @UseFilters(DemoFilter) export class PostsController { From 3f353b99361668da0d628bb5b58fbfa78493c93c Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 21:45:02 +0800 Subject: [PATCH 22/37] =?UTF-8?q?=E6=96=B0=E5=BB=BA=E4=B8=80=E4=B8=AAdemoR?= =?UTF-8?q?oles=E7=9A=84=E5=AE=88=E5=8D=AB=EF=BC=8Cnest=20generate=20guard?= =?UTF-8?q?=20demoRoles=20core/guards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/guards/demo-roles.guard.spec.ts | 7 +++++++ src/core/guards/demo-roles.guard.ts | 11 +++++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/core/guards/demo-roles.guard.spec.ts create mode 100644 src/core/guards/demo-roles.guard.ts diff --git a/src/core/guards/demo-roles.guard.spec.ts b/src/core/guards/demo-roles.guard.spec.ts new file mode 100644 index 0000000..ba3635d --- /dev/null +++ b/src/core/guards/demo-roles.guard.spec.ts @@ -0,0 +1,7 @@ +import { DemoRolesGuard } from './demo-roles.guard'; + +describe('DemoRolesGuard', () => { + it('should be defined', () => { + expect(new DemoRolesGuard()).toBeDefined(); + }); +}); diff --git a/src/core/guards/demo-roles.guard.ts b/src/core/guards/demo-roles.guard.ts new file mode 100644 index 0000000..d9cd555 --- /dev/null +++ b/src/core/guards/demo-roles.guard.ts @@ -0,0 +1,11 @@ +import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; +import { Observable } from 'rxjs'; + +@Injectable() +export class DemoRolesGuard implements CanActivate { + canActivate( + context: ExecutionContext, + ): boolean | Promise | Observable { + return true; + } +} From 8bb51034c771e0722ba8d21a9101aa6fc13d08be Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 21:50:55 +0800 Subject: [PATCH 23/37] =?UTF-8?q?guards=EF=BC=8C=E6=8A=8AdemoAuth=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=EF=BC=8C=E6=8A=8AdemoRoles=E7=94=A8=E5=9C=A8=E5=85=A8?= =?UTF-8?q?=E5=B1=80APP=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.module.ts | 12 +++++++++++- src/core/guards/demo-roles.guard.ts | 2 +- src/modules/posts/posts.controller.ts | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index 5214add..72e6c21 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -3,11 +3,21 @@ import { AppController } from './app.controller'; import { AppService } from './app.service'; import { PostsModule } from './modules/posts/posts.module'; import { DemoMiddleware } from './core/middleware/demo.middleware' +import { APP_GUARD } from '@nestjs/core'; +import { DemoRolesGuard } from './core/guards/demo-roles.guard' + + @Module({ imports: [PostsModule], controllers: [AppController], - providers: [AppService], + providers: [ + AppService, + { + provide: APP_GUARD, + useClass: DemoRolesGuard, + } + ], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { diff --git a/src/core/guards/demo-roles.guard.ts b/src/core/guards/demo-roles.guard.ts index d9cd555..7314792 100644 --- a/src/core/guards/demo-roles.guard.ts +++ b/src/core/guards/demo-roles.guard.ts @@ -6,6 +6,6 @@ export class DemoRolesGuard implements CanActivate { canActivate( context: ExecutionContext, ): boolean | Promise | Observable { - return true; + return false; } } diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index 83f71ab..24a4871 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -6,7 +6,7 @@ import { DemoAuthGuard } from '../../core/guards/demo-auth.guard' @Controller('posts') -@UseGuards(DemoAuthGuard) +// @UseGuards(DemoAuthGuard) // @UseFilters(DemoFilter) export class PostsController { From 81eee14d5d4466502637d766b7b938c434ef02b6 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 22:10:06 +0800 Subject: [PATCH 24/37] =?UTF-8?q?=E5=9C=A8=E6=8E=A7=E5=88=B6=E5=99=A8?= =?UTF-8?q?=E9=87=8C=E9=9D=A2=E5=8F=AF=E4=BB=A5=E9=99=84=E5=8A=A0metadata?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E5=AE=88=E5=8D=AB=E9=87=8C=E9=9D=A2=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E9=80=9A=E8=BF=87reflector=E6=9D=A5=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=88=B0=E5=AF=B9=E5=BA=94handler=E7=9A=84metadata?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/guards/demo-roles.guard.ts | 8 ++++++++ src/modules/posts/posts.controller.ts | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/core/guards/demo-roles.guard.ts b/src/core/guards/demo-roles.guard.ts index 7314792..9f4ead8 100644 --- a/src/core/guards/demo-roles.guard.ts +++ b/src/core/guards/demo-roles.guard.ts @@ -1,11 +1,19 @@ import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { Observable } from 'rxjs'; +import { Reflector } from '@nestjs/core'; @Injectable() export class DemoRolesGuard implements CanActivate { + constructor(private readonly reflector: Reflector) {} + canActivate( context: ExecutionContext, ): boolean | Promise | Observable { + console.log('handler:', context.getHandler()); + console.log('class:', context.getClass()); + + const roles = this.reflector.get('roles', context.getHandler()) + console.log(roles) return false; } } diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index 24a4871..db1f11b 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException, UseFilters, UsePipes, ValidationPipe, ParseIntPipe, UseGuards } from '@nestjs/common'; +import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException, UseFilters, UsePipes, ValidationPipe, ParseIntPipe, UseGuards, SetMetadata } from '@nestjs/common'; import { CreatePostDto } from './post.dto'; import { DemoService } from './providers/demo/demo.service' import { DemoFilter } from '../../core/filters/demo.filter' @@ -29,6 +29,7 @@ export class PostsController { @Post() // @UseFilters(DemoFilter) @UsePipes(ValidationPipe) + @SetMetadata('roles', ['member', 89]) store(@Body() post: CreatePostDto) { // throw new HttpException('没有权限!', HttpStatus.FORBIDDEN) // throw new ForbiddenException('没有权限!') From aaa24cac23480ae74450ef559c0a80935c55d8a3 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 22:40:19 +0800 Subject: [PATCH 25/37] =?UTF-8?q?=E9=AA=8C=E8=AF=81=E8=A7=92=E8=89=B2?= =?UTF-8?q?=EF=BC=8C=E7=8E=B0=E5=9C=A8=E6=98=AF=E7=94=B1=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E4=BB=B6=E6=9D=A5=E5=B8=AE=E5=BF=99=E6=B7=BB=E5=8A=A0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=A7=92=E8=89=B2=E4=BF=A1=E6=81=AF=EF=BC=8C=E8=B7=9F?= =?UTF-8?q?=E8=BF=9B=E5=A4=B4=E9=83=A8=E4=BF=A1=E6=81=AF=E6=9D=A5=E7=9A=84?= =?UTF-8?q?=E3=80=82=E5=AE=9E=E9=99=85=E7=9A=84=E8=AF=9D=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E5=B0=B1=E6=98=AF=E8=B7=9F=E8=BF=9B=E7=94=A8=E6=88=B7ID?= =?UTF-8?q?=E6=9F=A5=E6=95=B0=E6=8D=AE=E5=BA=93=E6=9D=A5=E5=BE=97=E5=88=B0?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/guards/demo-roles.guard.ts | 11 ++++++++++- src/core/middleware/demo.middleware.ts | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/core/guards/demo-roles.guard.ts b/src/core/guards/demo-roles.guard.ts index 9f4ead8..2c75c26 100644 --- a/src/core/guards/demo-roles.guard.ts +++ b/src/core/guards/demo-roles.guard.ts @@ -14,6 +14,15 @@ export class DemoRolesGuard implements CanActivate { const roles = this.reflector.get('roles', context.getHandler()) console.log(roles) - return false; + + if (!roles) { + return true + } + + const request = context.switchToHttp().getRequest(); + const { user } = request; + const hasRole = () => user.roles.some(item => roles.includes(item)) + + return user && user.roles && hasRole(); } } diff --git a/src/core/middleware/demo.middleware.ts b/src/core/middleware/demo.middleware.ts index 18c0a06..942e278 100644 --- a/src/core/middleware/demo.middleware.ts +++ b/src/core/middleware/demo.middleware.ts @@ -4,6 +4,21 @@ import { Injectable, NestMiddleware } from '@nestjs/common'; export class DemoMiddleware implements NestMiddleware { use(req: any, res: any, next: () => void) { console.log('hello ~') + req.user = { + roles: [ + 'guest' + ] + } + + if (req.header('x-demo') === 'secret') { + req.user = { + roles: [ + 'member' + ] + } + } + + next(); } } From 2341872c51d02a4158865005318f49e4d44fd83f Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 22:42:15 +0800 Subject: [PATCH 26/37] =?UTF-8?q?=E6=AF=8F=E4=B8=80=E4=B8=AA=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=99=A8=E9=83=BD=E5=8A=A0=E8=A7=92=E8=89=B2=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=EF=BC=9F=E8=BF=99=E4=BC=9A=E9=9C=80=E8=A6=81=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=BC=96=E5=86=99=E8=A7=92=E8=89=B2=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E8=A1=8C=EF=BC=8C=E5=8A=A0=E4=B8=AA=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E8=A3=85=E9=A5=B0=E5=99=A8=E6=9D=A5=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E6=B7=BB=E5=8A=A0=E8=A7=92=E8=89=B2=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/decorators/roles.decorator.ts | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/core/decorators/roles.decorator.ts diff --git a/src/core/decorators/roles.decorator.ts b/src/core/decorators/roles.decorator.ts new file mode 100644 index 0000000..daec197 --- /dev/null +++ b/src/core/decorators/roles.decorator.ts @@ -0,0 +1,3 @@ +import { ReflectMetadata } from '@nestjs/common'; + +export const Roles = (...args: string[]) => ReflectMetadata('roles', args); From f887fbcf914920eb913ab7a78490c832b02d2c85 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 22:46:58 +0800 Subject: [PATCH 27/37] =?UTF-8?q?=E5=93=A6=EF=BC=8C=E8=BF=98=E6=98=AF?= =?UTF-8?q?=E8=A6=81=E5=86=99=E5=8F=82=E6=95=B0=E5=95=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/decorators/roles.decorator.ts | 4 ++-- src/modules/posts/posts.controller.ts | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/core/decorators/roles.decorator.ts b/src/core/decorators/roles.decorator.ts index daec197..e73a826 100644 --- a/src/core/decorators/roles.decorator.ts +++ b/src/core/decorators/roles.decorator.ts @@ -1,3 +1,3 @@ -import { ReflectMetadata } from '@nestjs/common'; +import { ReflectMetadata, SetMetadata } from '@nestjs/common'; -export const Roles = (...args: string[]) => ReflectMetadata('roles', args); +export const Roles = (...args: string[]) => SetMetadata('roles', args); diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index db1f11b..f977125 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -3,7 +3,7 @@ import { CreatePostDto } from './post.dto'; import { DemoService } from './providers/demo/demo.service' import { DemoFilter } from '../../core/filters/demo.filter' import { DemoAuthGuard } from '../../core/guards/demo-auth.guard' - +import { Roles } from '../../core/decorators/roles.decorator' @Controller('posts') // @UseGuards(DemoAuthGuard) @@ -29,7 +29,9 @@ export class PostsController { @Post() // @UseFilters(DemoFilter) @UsePipes(ValidationPipe) - @SetMetadata('roles', ['member', 89]) + // @SetMetadata('roles', ['member', 89]) + // @Roles('member', 'tester') + @Roles(...['member', 'tester']) store(@Body() post: CreatePostDto) { // throw new HttpException('没有权限!', HttpStatus.FORBIDDEN) // throw new ForbiddenException('没有权限!') From 9d695d3f524ce2fe3719001b0d819411ad67c5f0 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 22:49:45 +0800 Subject: [PATCH 28/37] =?UTF-8?q?=E6=96=B0=E5=BB=BA=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E5=99=A8nest=20generate=20interceptor=20logging=20core/interce?= =?UTF-8?q?ptors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/interceptors/logging.interceptor.spec.ts | 7 +++++++ src/core/interceptors/logging.interceptor.ts | 9 +++++++++ 2 files changed, 16 insertions(+) create mode 100644 src/core/interceptors/logging.interceptor.spec.ts create mode 100644 src/core/interceptors/logging.interceptor.ts diff --git a/src/core/interceptors/logging.interceptor.spec.ts b/src/core/interceptors/logging.interceptor.spec.ts new file mode 100644 index 0000000..978e0bb --- /dev/null +++ b/src/core/interceptors/logging.interceptor.spec.ts @@ -0,0 +1,7 @@ +import { LoggingInterceptor } from './logging.interceptor'; + +describe('LoggingInterceptor', () => { + it('should be defined', () => { + expect(new LoggingInterceptor()).toBeDefined(); + }); +}); diff --git a/src/core/interceptors/logging.interceptor.ts b/src/core/interceptors/logging.interceptor.ts new file mode 100644 index 0000000..77b5ab2 --- /dev/null +++ b/src/core/interceptors/logging.interceptor.ts @@ -0,0 +1,9 @@ +import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'; +import { Observable } from 'rxjs'; + +@Injectable() +export class LoggingInterceptor implements NestInterceptor { + intercept(context: ExecutionContext, next: CallHandler): Observable { + return next.handle(); + } +} From de3558a97d0ae70ddd21ffb94c9a8cc34b114e87 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 23:00:44 +0800 Subject: [PATCH 29/37] =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=99=A8=E4=B8=8A?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E5=90=AF=E7=94=A8=E6=8B=A6=E6=88=AA=E5=99=A8?= =?UTF-8?q?=EF=BC=8C=E6=96=B9=E6=B3=95=E9=87=8C=E9=9D=A2=E4=B9=9F=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=EF=BC=9B=E8=BF=98=E5=8F=AF=E4=BB=A5=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E5=90=AF=E7=94=A8=EF=BC=8C=E5=BE=85=E4=BC=9A=E6=8A=8A=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=99=A8=E7=9A=84=E5=8E=BB=E6=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.module.ts | 6 ++++++ src/core/interceptors/logging.interceptor.ts | 2 ++ src/modules/posts/posts.controller.ts | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/app.module.ts b/src/app.module.ts index 72e6c21..2bdf766 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -5,6 +5,8 @@ import { PostsModule } from './modules/posts/posts.module'; import { DemoMiddleware } from './core/middleware/demo.middleware' import { APP_GUARD } from '@nestjs/core'; import { DemoRolesGuard } from './core/guards/demo-roles.guard' +import { APP_INTERCEPTOR } from '@nestjs/core'; +import { LoggingInterceptor } from './core/interceptors/logging.interceptor' @@ -16,6 +18,10 @@ import { DemoRolesGuard } from './core/guards/demo-roles.guard' { provide: APP_GUARD, useClass: DemoRolesGuard, + }, + { + provide: APP_INTERCEPTOR, + useClass: LoggingInterceptor, } ], }) diff --git a/src/core/interceptors/logging.interceptor.ts b/src/core/interceptors/logging.interceptor.ts index 77b5ab2..26a3c1b 100644 --- a/src/core/interceptors/logging.interceptor.ts +++ b/src/core/interceptors/logging.interceptor.ts @@ -4,6 +4,8 @@ import { Observable } from 'rxjs'; @Injectable() export class LoggingInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable { + console.log('I am a interceptor!') + return next.handle(); } } diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index f977125..56fc6cc 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -1,13 +1,15 @@ -import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException, UseFilters, UsePipes, ValidationPipe, ParseIntPipe, UseGuards, SetMetadata } from '@nestjs/common'; +import { Controller, Get, Post, Req, Query, Headers, Param, Body, HttpException, HttpStatus, ForbiddenException, UseFilters, UsePipes, ValidationPipe, ParseIntPipe, UseGuards, SetMetadata, UseInterceptors } from '@nestjs/common'; import { CreatePostDto } from './post.dto'; import { DemoService } from './providers/demo/demo.service' import { DemoFilter } from '../../core/filters/demo.filter' import { DemoAuthGuard } from '../../core/guards/demo-auth.guard' import { Roles } from '../../core/decorators/roles.decorator' +import { LoggingInterceptor } from '../../core/interceptors/logging.interceptor' @Controller('posts') // @UseGuards(DemoAuthGuard) // @UseFilters(DemoFilter) +@ UseInterceptors(LoggingInterceptor) export class PostsController { constructor(private readonly demoService: DemoService) {} From efb6fe6a144bc8bcce77f93f7abb0ba2db509f5b Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 23:01:00 +0800 Subject: [PATCH 30/37] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=99=A8=E4=B8=8A=E7=9A=84=E6=8B=A6=E6=88=AA=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/posts/posts.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index 56fc6cc..4622619 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -9,7 +9,7 @@ import { LoggingInterceptor } from '../../core/interceptors/logging.interceptor' @Controller('posts') // @UseGuards(DemoAuthGuard) // @UseFilters(DemoFilter) -@ UseInterceptors(LoggingInterceptor) +// @ UseInterceptors(LoggingInterceptor) export class PostsController { constructor(private readonly demoService: DemoService) {} From 3a04b500607dbf394be80aa9c0abc692320818e4 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 23:06:35 +0800 Subject: [PATCH 31/37] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=B8=AApipe=E6=89=93=E5=8D=B0=E5=A4=84=E7=90=86=E5=AE=8Chandl?= =?UTF-8?q?er=E7=9A=84=E8=80=97=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/interceptors/logging.interceptor.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/core/interceptors/logging.interceptor.ts b/src/core/interceptors/logging.interceptor.ts index 26a3c1b..069d4eb 100644 --- a/src/core/interceptors/logging.interceptor.ts +++ b/src/core/interceptors/logging.interceptor.ts @@ -1,11 +1,21 @@ import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'; import { Observable } from 'rxjs'; +import { tap } from 'rxjs/operators' @Injectable() export class LoggingInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable { console.log('I am a interceptor!') + + const now = Date.now(); + console.log('before...'); + + - return next.handle(); + return next + .handle() + .pipe( + tap(() => console.log(`after... ${Date.now() - now}ms`)) + ); } } From ad0359f4f4507081c009d94797524ea15d807800 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Wed, 19 Jun 2019 23:08:45 +0800 Subject: [PATCH 32/37] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E6=95=B0=E6=8D=AE=E7=9A=84=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E5=99=A8=EF=BC=8Cnest=20generate=20interceptor=20transform=20c?= =?UTF-8?q?ore/interceptors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/interceptors/transform.interceptor.spec.ts | 7 +++++++ src/core/interceptors/transform.interceptor.ts | 9 +++++++++ 2 files changed, 16 insertions(+) create mode 100644 src/core/interceptors/transform.interceptor.spec.ts create mode 100644 src/core/interceptors/transform.interceptor.ts diff --git a/src/core/interceptors/transform.interceptor.spec.ts b/src/core/interceptors/transform.interceptor.spec.ts new file mode 100644 index 0000000..b1cd38a --- /dev/null +++ b/src/core/interceptors/transform.interceptor.spec.ts @@ -0,0 +1,7 @@ +import { TransformInterceptor } from './transform.interceptor'; + +describe('TransformInterceptor', () => { + it('should be defined', () => { + expect(new TransformInterceptor()).toBeDefined(); + }); +}); diff --git a/src/core/interceptors/transform.interceptor.ts b/src/core/interceptors/transform.interceptor.ts new file mode 100644 index 0000000..e46fe38 --- /dev/null +++ b/src/core/interceptors/transform.interceptor.ts @@ -0,0 +1,9 @@ +import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'; +import { Observable } from 'rxjs'; + +@Injectable() +export class TransformInterceptor implements NestInterceptor { + intercept(context: ExecutionContext, next: CallHandler): Observable { + return next.handle(); + } +} From d56b4f21db66966194b04341defcfebe0c181f2f Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Thu, 20 Jun 2019 21:46:54 +0800 Subject: [PATCH 33/37] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E6=8B=A6=E6=88=AA=E5=99=A8=EF=BC=8C=E8=BF=99?= =?UTF-8?q?=E4=B8=AA=E6=84=9F=E8=A7=89=E5=8F=AF=E4=BB=A5=E7=94=A8=E6=9D=A5?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E6=95=B0=E6=8D=AE=E5=AD=97=E6=AE=B5=E5=95=A5?= =?UTF-8?q?=E7=9A=84=EF=BC=8C=E6=AF=95=E7=AB=9F=E4=BB=85=E9=9D=A0=E4=BA=BA?= =?UTF-8?q?=E4=B8=BA=E6=8E=A7=E5=88=B6=EF=BC=8C=E4=B8=8D=E5=A4=9F=E7=BB=9D?= =?UTF-8?q?=E5=AF=B9=E5=8F=AF=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/interceptors/transform.interceptor.ts | 15 ++++++++++++--- src/modules/posts/posts.controller.ts | 2 ++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/core/interceptors/transform.interceptor.ts b/src/core/interceptors/transform.interceptor.ts index e46fe38..a5a8184 100644 --- a/src/core/interceptors/transform.interceptor.ts +++ b/src/core/interceptors/transform.interceptor.ts @@ -1,9 +1,18 @@ import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'; import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +export interface Response{ + data: T; +} @Injectable() -export class TransformInterceptor implements NestInterceptor { - intercept(context: ExecutionContext, next: CallHandler): Observable { - return next.handle(); +export class TransformInterceptor implements NestInterceptor> { + intercept(context: ExecutionContext, next: CallHandler): Observable> { + return next + .handle() + .pipe( + map(item => ({data: item})) // 这个map和js那个map貌似还是有点不一样,那边返回的是一个数组呀? + ); } } diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index 4622619..0f09f9b 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -5,6 +5,7 @@ import { DemoFilter } from '../../core/filters/demo.filter' import { DemoAuthGuard } from '../../core/guards/demo-auth.guard' import { Roles } from '../../core/decorators/roles.decorator' import { LoggingInterceptor } from '../../core/interceptors/logging.interceptor' +import { TransformInterceptor } from '../../core/interceptors/transform.interceptor' @Controller('posts') // @UseGuards(DemoAuthGuard) @@ -15,6 +16,7 @@ export class PostsController { constructor(private readonly demoService: DemoService) {} @Get() + @UseInterceptors(TransformInterceptor) index() { return this.demoService.findAll(); } From 3e83be0032f7d046819c9d11244b05ee89626901 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Thu, 20 Jun 2019 21:48:28 +0800 Subject: [PATCH 34/37] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=8B=A6=E6=88=AA=E5=99=A8errors=20intercept?= =?UTF-8?q?or=EF=BC=8C=E4=B9=8B=E5=89=8D=E5=A5=BD=E5=83=8F=E6=9C=89?= =?UTF-8?q?=E4=B8=AA=E8=BF=87=E6=BB=A4=E5=99=A8filters=EF=BC=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/interceptors/errors.interceptor.spec.ts | 7 +++++++ src/core/interceptors/errors.interceptor.ts | 9 +++++++++ 2 files changed, 16 insertions(+) create mode 100644 src/core/interceptors/errors.interceptor.spec.ts create mode 100644 src/core/interceptors/errors.interceptor.ts diff --git a/src/core/interceptors/errors.interceptor.spec.ts b/src/core/interceptors/errors.interceptor.spec.ts new file mode 100644 index 0000000..ca053f7 --- /dev/null +++ b/src/core/interceptors/errors.interceptor.spec.ts @@ -0,0 +1,7 @@ +import { ErrorsInterceptor } from './errors.interceptor'; + +describe('ErrorsInterceptor', () => { + it('should be defined', () => { + expect(new ErrorsInterceptor()).toBeDefined(); + }); +}); diff --git a/src/core/interceptors/errors.interceptor.ts b/src/core/interceptors/errors.interceptor.ts new file mode 100644 index 0000000..de5f413 --- /dev/null +++ b/src/core/interceptors/errors.interceptor.ts @@ -0,0 +1,9 @@ +import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'; +import { Observable } from 'rxjs'; + +@Injectable() +export class ErrorsInterceptor implements NestInterceptor { + intercept(context: ExecutionContext, next: CallHandler): Observable { + return next.handle(); + } +} From 48a48e0a4c7e6b1e884106cd42222e21c0bb7319 Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Thu, 20 Jun 2019 21:59:56 +0800 Subject: [PATCH 35/37] =?UTF-8?q?=E5=90=AF=E7=94=A8=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=E5=88=9A=E8=BF=99=E4=B8=AAerrors=E6=8B=A6=E6=88=AA=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=99=A8=EF=BC=8C=E5=AE=83=E7=8E=B0=E5=9C=A8=E6=8A=8A?= =?UTF-8?q?403=E9=94=99=E8=AF=AF=E5=8F=98=E6=88=90=E4=BA=86502=E9=94=99?= =?UTF-8?q?=E8=AF=AF=EF=BC=8C=E6=84=9F=E8=A7=89=E7=94=A8=E6=9D=A5=E5=81=9A?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF=E8=A7=84=E8=8C=83=E5=8C=96?= =?UTF-8?q?=E6=AF=94=E8=BE=83=E9=80=82=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/interceptors/errors.interceptor.ts | 11 ++++++++--- src/modules/posts/posts.controller.ts | 5 ++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/core/interceptors/errors.interceptor.ts b/src/core/interceptors/errors.interceptor.ts index de5f413..a374e5b 100644 --- a/src/core/interceptors/errors.interceptor.ts +++ b/src/core/interceptors/errors.interceptor.ts @@ -1,9 +1,14 @@ -import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'; -import { Observable } from 'rxjs'; +import { CallHandler, ExecutionContext, Injectable, NestInterceptor, BadGatewayException } from '@nestjs/common'; +import { Observable, throwError } from 'rxjs'; +import { catchError } from 'rxjs/operators' @Injectable() export class ErrorsInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable { - return next.handle(); + return next + .handle() + .pipe( + catchError(error => throwError(new BadGatewayException())) + ); } } diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index 0f09f9b..46994d6 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -6,6 +6,7 @@ import { DemoAuthGuard } from '../../core/guards/demo-auth.guard' import { Roles } from '../../core/decorators/roles.decorator' import { LoggingInterceptor } from '../../core/interceptors/logging.interceptor' import { TransformInterceptor } from '../../core/interceptors/transform.interceptor' +import { ErrorsInterceptor } from '../../core/interceptors/errors.interceptor' @Controller('posts') // @UseGuards(DemoAuthGuard) @@ -17,8 +18,10 @@ export class PostsController { @Get() @UseInterceptors(TransformInterceptor) + @UseInterceptors(ErrorsInterceptor) index() { - return this.demoService.findAll(); + throw new ForbiddenException(); + // return this.demoService.findAll(); } @Get(':id') From 0833a38d69bdb03cf4585a8e7ea51eaa742d4c9e Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Thu, 20 Jun 2019 22:17:25 +0800 Subject: [PATCH 36/37] =?UTF-8?q?=E9=92=88=E5=AF=B9User=E8=A3=85=E9=A5=B0?= =?UTF-8?q?=E5=99=A8=E8=8E=B7=E5=8F=96=E6=95=B0=E6=8D=AE=E6=9B=B4=E8=BF=9B?= =?UTF-8?q?=E4=B8=80=E6=AD=A5=EF=BC=8C=E7=9B=B4=E6=8E=A5=E6=8B=BFuser?= =?UTF-8?q?=E9=87=8C=E9=9D=A2=E7=9A=84=E6=95=B0=E6=8D=AE=EF=BC=8C=E7=BB=99?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=AD=97=E6=AE=B5=E7=BB=99=E5=AE=83=EF=BC=8C?= =?UTF-8?q?=E8=AE=A9=E5=AE=83=E5=B8=AE=E5=BF=99=E6=8B=BF=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=EF=BC=8C=E8=BF=99=E6=A0=B7=E5=B0=B1=E4=B8=8D=E7=94=A8=E8=87=AA?= =?UTF-8?q?=E5=B7=B1=E6=8B=BF=E4=BA=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/decorators/user.decorator.ts | 7 +++++++ src/modules/posts/posts.controller.ts | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/core/decorators/user.decorator.ts diff --git a/src/core/decorators/user.decorator.ts b/src/core/decorators/user.decorator.ts new file mode 100644 index 0000000..5dd8faf --- /dev/null +++ b/src/core/decorators/user.decorator.ts @@ -0,0 +1,7 @@ +import { createParamDecorator } from '@nestjs/common' + +export const User = createParamDecorator((data, req) => { + console.log('data:', data) + + return req.user[data] +}) \ No newline at end of file diff --git a/src/modules/posts/posts.controller.ts b/src/modules/posts/posts.controller.ts index 46994d6..47674d5 100644 --- a/src/modules/posts/posts.controller.ts +++ b/src/modules/posts/posts.controller.ts @@ -4,6 +4,7 @@ import { DemoService } from './providers/demo/demo.service' import { DemoFilter } from '../../core/filters/demo.filter' import { DemoAuthGuard } from '../../core/guards/demo-auth.guard' import { Roles } from '../../core/decorators/roles.decorator' +import { User } from '../../core/decorators/user.decorator' import { LoggingInterceptor } from '../../core/interceptors/logging.interceptor' import { TransformInterceptor } from '../../core/interceptors/transform.interceptor' import { ErrorsInterceptor } from '../../core/interceptors/errors.interceptor' @@ -39,7 +40,10 @@ export class PostsController { // @SetMetadata('roles', ['member', 89]) // @Roles('member', 'tester') @Roles(...['member', 'tester']) - store(@Body() post: CreatePostDto) { + store(@Body() post: CreatePostDto, @User('roles') roles) { + console.log('roles:', roles) + + // throw new HttpException('没有权限!', HttpStatus.FORBIDDEN) // throw new ForbiddenException('没有权限!') this.demoService.create(post); From 2ffe58a6b930e9b75eef808ad03328fd5f9d40ce Mon Sep 17 00:00:00 2001 From: Jeremy Yin Date: Thu, 20 Jun 2019 22:19:03 +0800 Subject: [PATCH 37/37] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E7=AE=A1=E9=81=93pipe=EF=BC=8Cdemo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/pipes/demo.pipe.spec.ts | 7 +++++++ src/core/pipes/demo.pipe.ts | 8 ++++++++ 2 files changed, 15 insertions(+) create mode 100644 src/core/pipes/demo.pipe.spec.ts create mode 100644 src/core/pipes/demo.pipe.ts diff --git a/src/core/pipes/demo.pipe.spec.ts b/src/core/pipes/demo.pipe.spec.ts new file mode 100644 index 0000000..e2a7102 --- /dev/null +++ b/src/core/pipes/demo.pipe.spec.ts @@ -0,0 +1,7 @@ +import { DemoPipe } from './demo.pipe'; + +describe('DemoPipe', () => { + it('should be defined', () => { + expect(new DemoPipe()).toBeDefined(); + }); +}); diff --git a/src/core/pipes/demo.pipe.ts b/src/core/pipes/demo.pipe.ts new file mode 100644 index 0000000..214b763 --- /dev/null +++ b/src/core/pipes/demo.pipe.ts @@ -0,0 +1,8 @@ +import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common'; + +@Injectable() +export class DemoPipe implements PipeTransform { + transform(value: any, metadata: ArgumentMetadata) { + return value; + } +}