Websocket 如何使用Apollo GraphQL获得订阅?
我将发布大量上下文代码。我还没有看到一个教程同时显示客户端和服务器,所以我正在尝试将这一切结合起来 代码 客户 网络接口 组成部分 服务器 graphql.schema.graphqls 解析器 pubSub WebSocket服务器 问题 当我用这个组件加载页面时,它使用网络接口加载数据,并正确呈现。之后,我想通过websocket订阅组件更新,以使其保持最新。这是我遇到麻烦的部分 在Chrome开发工具中,我可以看到“updateQuery”立即被点击,尽管我不知道为什么。目前还没有“发布”任何内容<代码>订阅数据显示为:Websocket 如何使用Apollo GraphQL获得订阅?,websocket,publish-subscribe,graphql,apollo,react-apollo,Websocket,Publish Subscribe,Graphql,Apollo,React Apollo,我将发布大量上下文代码。我还没有看到一个教程同时显示客户端和服务器,所以我正在尝试将这一切结合起来 代码 客户 网络接口 组成部分 服务器 graphql.schema.graphqls 解析器 pubSub WebSocket服务器 问题 当我用这个组件加载页面时,它使用网络接口加载数据,并正确呈现。之后,我想通过websocket订阅组件更新,以使其保持最新。这是我遇到麻烦的部分 在Chrome开发工具中,我可以看到“updateQuery”立即被点击,尽管我不知道为什么。目前还没有“发布”
{
data: {
branchUpdated: null
}
}
在服务器上,我可以看到原因。在我的resolverMap
中,会立即点击Subscription.branchUpdated.resolve
<代码>有效负载是未定义的,可能是因为我还没有发布任何内容<代码>订阅。分支更新。订阅从未执行
当我向我的“分支”发布更新时,什么也没发生。无论是branchUpdated
还是subscribe
都不会被调用,即使我调用了pubSub.publish
。不向客户端返回任何内容
因此,我的问题是:
我终于明白了。有一些问题
graphql@0.9.6
没有{subscribe}
,您至少需要v0.10with filter
是错误的branch.id
是一个缓冲区——我需要使用它来比较它们componentDidMount() {
this.props.data.subscribeToMore({
document: SUBSCRIPTION_QUERY,
variables: {
id: this.props.match.params.id,
},
updateQuery: (prevResult, {subscriptionData}) => {
log('updateQuery',prevResult,subscriptionData.data.branchUpdated);
return {branch: subscriptionData.data.branchUpdated};
}
});
}
我终于明白了。有一些问题
graphql@0.9.6
没有{subscribe}
,您至少需要v0.10with filter
是错误的branch.id
是一个缓冲区——我需要使用它来比较它们componentDidMount() {
this.props.data.subscribeToMore({
document: SUBSCRIPTION_QUERY,
variables: {
id: this.props.match.params.id,
},
updateQuery: (prevResult, {subscriptionData}) => {
log('updateQuery',prevResult,subscriptionData.data.branchUpdated);
return {branch: subscriptionData.data.branchUpdated};
}
});
}
{subscribe}
未在中定义graphql@0.9.6,我相信至少需要0.10。这是我的问题之一<当您传递未定义的订阅服务器时,它不会抱怨,导入也不会抱怨。{subscribe}
未在中定义graphql@0.9.6,我相信至少需要0.10。这是我的问题之一<代码>订阅服务器
在您传递它时不会抱怨未定义
,导入
也不会抱怨。
const resolverMap = {
Query: {
async branch(obj, {id}, context, info) {
*snip*
return branch;
},
},
Mutation: {
async updateBranch(_, req) {
let {id, ...updates} = req;
let branch = await db::queryOne("select * from Branches where id=?", [id]);
updates = getUpdates(req);
Object.assign(branch, updates);
await db::mutate("update Branches set ? where id=?", [updates, id]);
pubSub.publish(topics.BRANCH_UPDATED, {branchUpdated: branch});
return branch;
},
},
Subscription: {
branchUpdated: {
resolve: (payload, args, context, info) => {
log('RESSSSSSSSSSSSSSSSoLVE',payload,args);
return payload;
},
subscribe: withFilter(() => pubSub.asyncIterator(topics.BRANCH_UPDATED), (payload, variables) => {
log('FILTERRRRRRRRRRRRRRRRRRRRRRR');
return payload.branchUpdated.id === variables.id;
}),
},
},
};
import { PubSub } from 'graphql-subscriptions';
const pubSub = new PubSub();
export default pubSub;
const wsServer = createServer((request, response) => {
response.writeHead(404);
response.end();
});
wsServer.listen(WS_PORT, () => {
console.log(`Websocket server: http://localhost:${WS_PORT}`)
});
const subscriptionServer = SubscriptionServer.create(
{
schema,
execute,
subscribe,
},
{
server: wsServer,
path: '/',
}
);
{
data: {
branchUpdated: null
}
}
componentDidMount() {
this.props.data.subscribeToMore({
document: SUBSCRIPTION_QUERY,
variables: {
id: this.props.match.params.id,
},
updateQuery: (prevResult, {subscriptionData}) => {
log('updateQuery',prevResult,subscriptionData.data.branchUpdated);
return {branch: subscriptionData.data.branchUpdated};
}
});
}