订阅
订阅
订阅只是另一种GraphQL操作类型,如Query和Mutation。它允许在双向传输层上创建实时订阅,主要通过websockets。在此处阅读有关订阅的更多信息。以下是commentAdded订阅示例,直接从官方Apollo文档中复制并粘贴:
Subscription: {
commentAdded: {
subscribe: () => pubSub.asyncIterator('commentAdded')
}
}
注意
这pubsub
是一个PubSub
类的实例。
为了在Nest中创建一个等价的订阅,我们将使用@Subscription()
装饰器。让我们AuthorResolver
在解析器部分扩展我们的用法。
const pubSub = new PubSub(
@Resolver('Author')
export class AuthorResolver {
constructor(
private readonly authorsService: AuthorsService,
private readonly postsService: PostsService,
) {}
@Query('author')
async getAuthor(@Args('id') id: number) {
return await this.authorsService.findOneById(id
}
@ResolveProperty('posts')
async getPosts(@Parent() author) {
const { id } = author;
return await this.postsService.findAll{ authorId: id }
}
@Subscription()
commentAdded() {
return {
subscribe: () => pubSub.asyncIterator('commentAdded'),
};
}
}
我们PubSub
在这里使用了一个本地实例。相反,我们应该定义PubSub
为提供者
,通过构造函数(使用@Inject()
装饰器)注入它,并在整个应用程序中重用它。
模
为了启用订阅,我们必须将installSubscriptionHandlers
属性设置为true
。
GraphQLModule.forRoot{
typePaths: ['./**/*.graphql'],
installSubscriptionHandlers: true,
})
要自定义订阅服务器(例如,更改端口),您可以使用subscriptions
属性。
类型定义
最后一步是更新类型定义文件。
type Author {
id: Int!
firstName: String
lastName: String
posts: [Post]
}
type Post {
id: Int!
title: String
votes: Int
}
type Query {
author(id: Int!): Author
}
type Comment {
id: String
content: String
}
type Subscription {
commentAdded(repoFullName: String!): Comment
}
做得好。我们创建了一个commentAdded(repoFullName: String!): Comment
订阅。