如何在graphql.js中实现订阅?

时间:2019-10-22 13:03:12

标签: graphql graphql-js graphql-subscriptions

这是一个非常简单的问题。

如何在graphql中实现订阅?

我是在特别要求使用下面的graphql.js构造函数时?

我找不到干净/简单的实施方式。

还有另一个question here,但它处理的是relay.js-我不想不必要地增加应用程序中外部依赖关系的数量。

我所拥有的:

module.exports = function (database){
  return new GraphQLSchema(
    { query: RootQuery(database)
    , mutation: RootMutation(database)
    , subscription: RootSubscription(database) -- i can see this in graphiql - see below
    }
  );
}
function RootSubscription(database){
  return new GraphQLObjectType(
    { name: "RootSubscriptionType"
    , fields:
        { getCounterEvery2Seconds:
              { type: new GraphQLNonNull(GraphQLInt)
              , args :
                  { id: { type:  GraphQLString }
                  }
              , subscribe(parent, args, context){

                  // this subscribe function is never called .. why?

                  const iterator = simpleIterator()
                  return iterator
                }
              }
        }
    }
  )
}

我了解到我需要一个subscribe(),它必须从this github issue返回一个迭代器。

这是一个简单的异步迭代器。此迭代器所做的全部-是每2秒增加并返回一次计数器。当达到10时停止。

function simpleIterator(){
  return {
    [ Symbol.asyncIterator ]: () => {
      let i = 0

      return {

        next: async function(){
          i++
          await delay(2000)
          if(i > 10){
            return { done: true }
          }

          return {
            value: i,
            done: false
          }
        }

      }
    }
  }
}

当我运行graphiql订阅时,由于某种原因它返回null: how to implement graphql subscriptions?

我正在将来自多个来源的代码拼凑在一起-浪费时间并基本上对其进行黑客攻击。你能帮我解决这个问题吗? 订阅是如此重要,请在哪里正确记录?您刚刚复制粘贴的那段代码在哪里(例如查询,例如look here)。

此外,我不能使用架构分开的示例-作为字符串/来自文件。我已经将我的架构创建为 javascript构造函数。现在,由于我尝试添加订阅,因此我不能只回到使用模式作为字符串。需要重写整个项目。或者我可以同时拥有两者吗?谢谢:)

0 个答案:

没有答案