如何立即触发阿波罗graphql订阅?

时间:2019-09-02 12:56:58

标签: node.js websocket graphql observable apollo

我使用Apollo Server和Node.js进行了项目设置。以下代码使用pubsub模式侦听帖子中的更改,并在它们为'POSTS_CHANGED'pubsub.publish事件时触发graphql订阅。我将setInterval计时器用于演示目的。

我想仅在连接客户端时触发订阅。那是他/她加载页面时获取帖子。但是我想不出办法。

const { ApolloServer, PubSub, gql } = require('apollo-server')

const pubsub = new PubSub();

setInterval(async () => {
    pubsub.publish('POSTS_CHANGED', { posts: [{title: 'title1', body: 'body1'}] })
}, 5*1000)

const typeDefs = gql`
    type Post {
        title: String
        body: String
    }

    type Subscription {
        posts: [Post]
    }
`

const resolvers = {
    Subscription: {
        posts: {
            subscribe: () => pubsub.asyncIterator(['POSTS_CHANGED']),
        }
    }
};

const apolloServer = new ApolloServer({ typeDefs, resolvers})

apolloServer.listen()
    .then((connection) => {
        console.log(`Apollo http running on ${connection.url}`)
        console.log(`Apollo web sockets running on ${connection.subscriptionsUrl}`)
    })

我想避免使用单独的Query来加载页面加载时的帖子,以保持项目的简洁明了,除非有严重的理由。

1 个答案:

答案 0 :(得分:0)

希望对您有帮助。...

您应该在asyncIterator中使用字符串值。

Subscription: {
    posts: {
        subscribe: () => pubsub.asyncIterator('POSTS_CHANGED'),
    }
  }