带过滤器的graphql-subscriptions返回未定义;没有变量的订阅工作正常

时间:2018-06-20 09:43:18

标签: graphql graphql-js graphql-subscriptions

我正在努力了解graphql-subscriptions和withFilter。没有变量的订阅可以按预期工作,但是如果我尝试使用withFilter,我只会得到“订阅字段必须返回Async Iterable。收到:未定义”错误,当我尝试运行订阅时。

我在设置withFilter时做错了什么,是我正在使用的软件包中的某些不兼容之处,还是我在这里完全遗漏了一些明显的东西?所有查询和变异都能正常工作,因此基本设置应该没问题。

我的设置与此类似(所有代码段均位于https://gist.github.com/aqmattil/41e10e7c9f30b8ea964cecdc61c58f20

Package.json

// package.json
"dependencies": {
    "apollo-server-express": "^2.0.0-beta.2",
    "body-parser": "^1.18.3",
    "express": "^4.16.3",
    "graphql": "^0.13.2",
    "graphql-subscriptions": "^0.5.8",
    "subscriptions-transport-ws": "^0.9.11"
  }

突变

// mutations.js
const mutation = new GraphQLObjectType({
name: 'mutation',
fields: {
    addSite: {
        type: SiteType,
        description: "Create a new Site",
        args: {
            name: { type: new GraphQLNonNull(GraphQLString) },
            location: { type: GraphQLString },
            company: { type: GraphQLString }
        },
        async resolve(parentValue, { name, location, company }) {
            const site = await new Site({ name, location, company }).save()
            const siteid = site._id;
            console.log("addSite resolve", siteid, name, location, company );
            pubsub.publish('siteAdded', { 'siteAdded': site } );
            return site;
        }
    }
    }
});
module.exports = mutation;

订阅

// subscriptions.js
const graphql = require('graphql');
const {
    GraphQLObjectType,
    GraphQLString
} = graphql;
const { withFilter } = require('graphql-subscriptions');

const SiteType = require('./site_type');
const pubsub = require('./pubsub_helper');

const Subscriptions = new GraphQLObjectType({
name: 'subscription',
fields: () => ({
/* 
    // this code works, commented out to test withfilter
    siteAdded: {
        type: SiteType,
        resolve(payload) {
            return payload.siteAdded;
        },
        subscribe() {
            return pubsub.asyncIterator('siteAdded');
        }
    },
 */
    // test withFilter
    siteAdded: {
        type: SiteType,
        args: {
            name: { type: GraphQLString }
        },
        resolve(payload) {
            return payload.siteAdded;
        },
        subscribe() {
            // this returns undefined 
            withFilter(
                () => {
                    console.log("in subscribe withfilter");
                    return pubsub.asyncIterator('siteAdded');
                }
            ),
            (payload, variables) => {
                console.log("payload, variables", payload, variables);
                return true;
            }
        }
    }
})
});
module.exports = Subscriptions;

我正在使用graphiql运行查询,

// this is used to add a site
mutation {
  addSite(name:"test name", location: "somewhere") {
    id
  }
}

// simple subscription -  this works as inteded, and new sites are shown 
subscription {
  siteAdded {
    name
    location
    company {
      id
    }
  }
}

// using query variables --> returns "Subscription 
// field must return Async Iterable. Received: undefined"
subscription {
  siteAdded(name: "test name") {
    name
    location
    company {
      id
    }
  }
} 

0 个答案:

没有答案