正在显示
11 个修改的文件
包含
226 行增加
和
8 行删除
@@ -2197,6 +2197,19 @@ | @@ -2197,6 +2197,19 @@ | ||
2197 | "uuid": "8.3.2" | 2197 | "uuid": "8.3.2" |
2198 | } | 2198 | } |
2199 | }, | 2199 | }, |
2200 | + "@nestjs/config": { | ||
2201 | + "version": "0.6.3", | ||
2202 | + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-0.6.3.tgz", | ||
2203 | + "integrity": "sha512-JxvvUpmH0/WOrTB+zh8dEkxSUQXhB7V3d/qeQXyCnMiEFjaq89+fNFztpWjz4DlOfdS4/eYTzIEy9PH2uGnfzA==", | ||
2204 | + "requires": { | ||
2205 | + "dotenv": "8.2.0", | ||
2206 | + "dotenv-expand": "5.1.0", | ||
2207 | + "lodash.get": "4.4.2", | ||
2208 | + "lodash.has": "4.5.2", | ||
2209 | + "lodash.set": "4.3.2", | ||
2210 | + "uuid": "8.3.2" | ||
2211 | + } | ||
2212 | + }, | ||
2200 | "@nestjs/core": { | 2213 | "@nestjs/core": { |
2201 | "version": "7.6.12", | 2214 | "version": "7.6.12", |
2202 | "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-7.6.12.tgz", | 2215 | "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-7.6.12.tgz", |
@@ -5354,6 +5367,16 @@ | @@ -5354,6 +5367,16 @@ | ||
5354 | } | 5367 | } |
5355 | } | 5368 | } |
5356 | }, | 5369 | }, |
5370 | + "dotenv": { | ||
5371 | + "version": "8.2.0", | ||
5372 | + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", | ||
5373 | + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" | ||
5374 | + }, | ||
5375 | + "dotenv-expand": { | ||
5376 | + "version": "5.1.0", | ||
5377 | + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", | ||
5378 | + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" | ||
5379 | + }, | ||
5357 | "ecc-jsbn": { | 5380 | "ecc-jsbn": { |
5358 | "version": "0.1.2", | 5381 | "version": "0.1.2", |
5359 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", | 5382 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", |
@@ -8041,6 +8064,21 @@ | @@ -8041,6 +8064,21 @@ | ||
8041 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", | 8064 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", |
8042 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" | 8065 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" |
8043 | }, | 8066 | }, |
8067 | + "lodash.get": { | ||
8068 | + "version": "4.4.2", | ||
8069 | + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", | ||
8070 | + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" | ||
8071 | + }, | ||
8072 | + "lodash.has": { | ||
8073 | + "version": "4.5.2", | ||
8074 | + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", | ||
8075 | + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=" | ||
8076 | + }, | ||
8077 | + "lodash.set": { | ||
8078 | + "version": "4.3.2", | ||
8079 | + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", | ||
8080 | + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" | ||
8081 | + }, | ||
8044 | "lodash.sortby": { | 8082 | "lodash.sortby": { |
8045 | "version": "4.7.0", | 8083 | "version": "4.7.0", |
8046 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", | 8084 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", |
@@ -8480,6 +8518,19 @@ | @@ -8480,6 +8518,19 @@ | ||
8480 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", | 8518 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", |
8481 | "dev": true | 8519 | "dev": true |
8482 | }, | 8520 | }, |
8521 | + "nestjs-config": { | ||
8522 | + "version": "1.4.7", | ||
8523 | + "resolved": "https://registry.npmjs.org/nestjs-config/-/nestjs-config-1.4.7.tgz", | ||
8524 | + "integrity": "sha512-lD/tW5UZ3J+awJSUOjjCjJ6QwXVoJBYuigDJONQj4FETxImPLeB30Brxgt6ZyGX8o3BvA5osDdNfYO2iKQUXRQ==", | ||
8525 | + "requires": { | ||
8526 | + "dotenv": "^8.0.0", | ||
8527 | + "glob": "^7.1.2", | ||
8528 | + "lodash.get": "^4.4.2", | ||
8529 | + "lodash.set": "^4.3.2", | ||
8530 | + "reflect-metadata": "^0.1.12", | ||
8531 | + "rxjs": "^6.0.0" | ||
8532 | + } | ||
8533 | + }, | ||
8483 | "nice-try": { | 8534 | "nice-try": { |
8484 | "version": "1.0.5", | 8535 | "version": "1.0.5", |
8485 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", | 8536 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", |
@@ -22,12 +22,14 @@ | @@ -22,12 +22,14 @@ | ||
22 | }, | 22 | }, |
23 | "dependencies": { | 23 | "dependencies": { |
24 | "@nestjs/common": "^7.5.1", | 24 | "@nestjs/common": "^7.5.1", |
25 | + "@nestjs/config": "^0.6.3", | ||
25 | "@nestjs/core": "^7.5.1", | 26 | "@nestjs/core": "^7.5.1", |
26 | "@nestjs/graphql": "^7.9.9", | 27 | "@nestjs/graphql": "^7.9.9", |
27 | "@nestjs/platform-express": "^7.5.1", | 28 | "@nestjs/platform-express": "^7.5.1", |
28 | "apollo-server-express": "^2.21.0", | 29 | "apollo-server-express": "^2.21.0", |
29 | "graphql": "^15.5.0", | 30 | "graphql": "^15.5.0", |
30 | "graphql-tools": "^7.0.4", | 31 | "graphql-tools": "^7.0.4", |
32 | + "nestjs-config": "^1.4.7", | ||
31 | "reflect-metadata": "^0.1.13", | 33 | "reflect-metadata": "^0.1.13", |
32 | "rimraf": "^3.0.2", | 34 | "rimraf": "^3.0.2", |
33 | "rxjs": "^6.6.3" | 35 | "rxjs": "^6.6.3" |
1 | import { Module } from '@nestjs/common'; | 1 | import { Module } from '@nestjs/common'; |
2 | -import { AppController } from './app.controller'; | ||
3 | -import { AppService } from './app.service'; | 2 | +import { GraphQLModule } from '@nestjs/graphql'; |
3 | +import { ConfigModule, ConfigService } from 'nestjs-config'; | ||
4 | +// import { AppController } from './app.controller'; | ||
5 | +// import { AppService } from './app.service'; | ||
6 | +import * as path from 'path'; | ||
4 | 7 | ||
5 | @Module({ | 8 | @Module({ |
6 | - imports: [], | ||
7 | - controllers: [AppController], | ||
8 | - providers: [AppService], | 9 | + imports: [ |
10 | + ConfigModule.load(path.resolve(__dirname, 'config', '**/!(*.d).{ts,js}')), | ||
11 | + GraphQLModule.forRootAsync({ | ||
12 | + imports: [ConfigModule], | ||
13 | + useFactory: (config: ConfigService) => config.get('graphql'), | ||
14 | + inject: [ConfigService], | ||
15 | + }), | ||
16 | + ], | ||
17 | + // controllers: [AppController], | ||
18 | + // providers: [AppService], | ||
9 | }) | 19 | }) |
10 | -export class AppModule {} | 20 | +// export class AppModule {} |
21 | +export class ApplicationModule {} |
src/config/graphql.ts
0 → 100644
1 | +import { ValidationPipe } from '@nestjs/common'; | ||
1 | import { NestFactory } from '@nestjs/core'; | 2 | import { NestFactory } from '@nestjs/core'; |
2 | -import { AppModule } from './app.module'; | 3 | +import { ApplicationModule } from './app.module'; |
3 | 4 | ||
4 | async function bootstrap() { | 5 | async function bootstrap() { |
5 | - const app = await NestFactory.create(AppModule); | 6 | + const app = await NestFactory.create(ApplicationModule); |
7 | + app.useGlobalPipes(new ValidationPipe()); | ||
8 | + | ||
6 | await app.listen(3000); | 9 | await app.listen(3000); |
10 | + console.log(`Application is running on: ${await app.getUrl()}`); | ||
7 | } | 11 | } |
8 | bootstrap(); | 12 | bootstrap(); |
src/modules/author/author.module.ts
0 → 100644
src/modules/author/author.resolver.ts
0 → 100644
1 | +import { | ||
2 | + Args, | ||
3 | + Mutation, | ||
4 | + Query, | ||
5 | + Resolver, | ||
6 | + Subscription, | ||
7 | + ResolveField, | ||
8 | + Parent, | ||
9 | + Int, | ||
10 | +} from '@nestjs/graphql'; | ||
11 | +import { PubSub } from 'graphql-subscriptions'; | ||
12 | +import { Author } from './models/aothor.model'; | ||
13 | +import { Post } from './models/post.model'; | ||
14 | +import { AuthorService } from './author.service'; | ||
15 | + | ||
16 | +const pubSub = new PubSub(); | ||
17 | + | ||
18 | +@Resolver(() => Author) | ||
19 | +export class AuthorResolver { | ||
20 | + constructor(private authorsService: AuthorService) {} | ||
21 | + // 根据id查询作者信息 | ||
22 | + @Query((returns) => Author, { | ||
23 | + name: 'author', | ||
24 | + description: 'get author info by id', | ||
25 | + nullable: false, | ||
26 | + }) | ||
27 | + async getAuthor( | ||
28 | + @Args('id', { | ||
29 | + type: () => Int, | ||
30 | + description: 'author id', | ||
31 | + nullable: false, | ||
32 | + }) | ||
33 | + id: number, | ||
34 | + ): Promise<any> { | ||
35 | + return { | ||
36 | + id, | ||
37 | + firstName: 'wu', | ||
38 | + lastName: 'pat', | ||
39 | + }; | ||
40 | + } | ||
41 | + // 修改作者信息 | ||
42 | + @Mutation((returns) => Author, { | ||
43 | + name: 'changeAuthor', | ||
44 | + description: 'change author info by id', | ||
45 | + nullable: false, | ||
46 | + }) | ||
47 | + async changeAuthor( | ||
48 | + @Args('id') id: number, | ||
49 | + @Args('firstName') firstName: string, | ||
50 | + @Args('lastName') lastName: string, | ||
51 | + ): Promise<any> { | ||
52 | + return { | ||
53 | + id, | ||
54 | + firstName, | ||
55 | + lastName, | ||
56 | + }; | ||
57 | + } | ||
58 | + // 解析posts字段 | ||
59 | + @ResolveField() | ||
60 | + async posts(@Parent() author: Author): Promise<any> { | ||
61 | + const { id } = author; | ||
62 | + return [ | ||
63 | + { | ||
64 | + id: 4, | ||
65 | + title: 'hello', | ||
66 | + votes: 2112, | ||
67 | + }, | ||
68 | + ]; | ||
69 | + } | ||
70 | + // 新增文章 | ||
71 | + @Mutation((returns) => Post) | ||
72 | + async addPost() { | ||
73 | + const newPost = { | ||
74 | + id: 1, | ||
75 | + title: '新增文章', | ||
76 | + }; | ||
77 | + // 新增成功后,通知更新 | ||
78 | + await pubSub.publish('postAdded', { postAdded: newPost }); | ||
79 | + return newPost; | ||
80 | + } | ||
81 | + | ||
82 | + // 监听变更 | ||
83 | + @Subscription((returns) => Post, { | ||
84 | + name: 'postAdded', | ||
85 | + }) | ||
86 | + async postAdded(/*@Args('title') title: string*/) { | ||
87 | + return pubSub.asyncIterator('postAdded'); | ||
88 | + } | ||
89 | +} |
src/modules/author/author.service.ts
0 → 100644
src/modules/author/dto/get-author.args.ts
0 → 100644
1 | +export class GetAuthorArgs {} |
src/modules/author/models/aothor.model.ts
0 → 100644
1 | +import { Field, Int, ObjectType } from '@nestjs/graphql'; | ||
2 | +import { Post } from './post.model'; | ||
3 | + | ||
4 | +@ObjectType({ description: 'Author model' }) | ||
5 | +export class Author { | ||
6 | + @Field((type) => Int, { | ||
7 | + description: '作者id', | ||
8 | + }) | ||
9 | + id: number; | ||
10 | + | ||
11 | + @Field({ | ||
12 | + nullable: true, | ||
13 | + description: '作者姓氏', | ||
14 | + }) | ||
15 | + firstName?: string; | ||
16 | + | ||
17 | + @Field({ | ||
18 | + nullable: true, | ||
19 | + description: '作者名字', | ||
20 | + }) | ||
21 | + lastName?: string; | ||
22 | + | ||
23 | + @Field((type) => [Post], { | ||
24 | + nullable: 'items', | ||
25 | + description: '作者发表的文章', | ||
26 | + }) | ||
27 | + posts: Post[]; | ||
28 | +} |
src/modules/author/models/post.model.ts
0 → 100644
-
请 注册 或 登录 后发表评论