GraphQL 订阅字段无法访问解析器的上下文
GraphQL Subscription fields not able to access context of resolver
我正在阅读这本书 Learning GraphQL,但在实施订阅时遇到了一个问题。从订阅中查看时,发送到订阅的对象字段之一的解析器不起作用,但奇怪的是它适用于突变和查询。有问题的解析器如下所示:
Photo: {
postedBy: (parent, args, {db}) => db.collection('users').findOne({githubLogin: parent.userID})
}
当我进行以下更改时,我收到了 postedBy 回复:
mutation($input: PostPhotoInput!) {
postPhoto(input: $input) {
name
url
postedBy {
name
}
}
}
当我查询 returns 类型时相同:
{
allPhotos {
name
postedBy {
name
}
}
}
但是当我开始以下订阅并进行它正在侦听的突变时:
subscription {
newPhoto {
name
url
postedBy {
name
}
}
}
我收到错误无法读取未定义 的属性 'collection'。
如果我在没有 postedBy 字段的情况下使用订阅,我不会收到错误消息。我只能假设未定义的对象是db,它是从上下文中传入的。为什么这适用于查询和变更,但不适用于订阅?
有关更多上下文,这里是订阅的解析器:
Subscription: {
newPhoto: {
subscribe: () => pubsub.asyncIterator('photo-added')
}
}
这里是发布订阅正在侦听的事件的突变的解析器:
async postPhoto(parent, {input}, {db, currentUser}) {
if (!currentUser)
throw new Error('Only an authorized user can post a photo');
const newPhoto = {
...input,
userID: currentUser.githubLogin,
created: new Date()
};
const {insertedId} = await db
.collection('photos')
.insertOne(newPhoto);
newPhoto.id = insertedId;
pubsub.publish('photo-added', {newPhoto});
return newPhoto;
}
我发现出了什么问题。事实证明,订阅不是从传递给 ApolloServer 的构造函数的上下文函数获取上下文,而是从传递给 SubscriptionServer 的构造函数的 onConnect 函数获取上下文,如 docs.[=11= 中所述。 ]
我正在阅读这本书 Learning GraphQL,但在实施订阅时遇到了一个问题。从订阅中查看时,发送到订阅的对象字段之一的解析器不起作用,但奇怪的是它适用于突变和查询。有问题的解析器如下所示:
Photo: {
postedBy: (parent, args, {db}) => db.collection('users').findOne({githubLogin: parent.userID})
}
当我进行以下更改时,我收到了 postedBy 回复:
mutation($input: PostPhotoInput!) {
postPhoto(input: $input) {
name
url
postedBy {
name
}
}
}
当我查询 returns 类型时相同:
{
allPhotos {
name
postedBy {
name
}
}
}
但是当我开始以下订阅并进行它正在侦听的突变时:
subscription {
newPhoto {
name
url
postedBy {
name
}
}
}
我收到错误无法读取未定义 的属性 'collection'。 如果我在没有 postedBy 字段的情况下使用订阅,我不会收到错误消息。我只能假设未定义的对象是db,它是从上下文中传入的。为什么这适用于查询和变更,但不适用于订阅?
有关更多上下文,这里是订阅的解析器:
Subscription: {
newPhoto: {
subscribe: () => pubsub.asyncIterator('photo-added')
}
}
这里是发布订阅正在侦听的事件的突变的解析器:
async postPhoto(parent, {input}, {db, currentUser}) {
if (!currentUser)
throw new Error('Only an authorized user can post a photo');
const newPhoto = {
...input,
userID: currentUser.githubLogin,
created: new Date()
};
const {insertedId} = await db
.collection('photos')
.insertOne(newPhoto);
newPhoto.id = insertedId;
pubsub.publish('photo-added', {newPhoto});
return newPhoto;
}
我发现出了什么问题。事实证明,订阅不是从传递给 ApolloServer 的构造函数的上下文函数获取上下文,而是从传递给 SubscriptionServer 的构造函数的 onConnect 函数获取上下文,如 docs.[=11= 中所述。 ]