首页 > 解决方案 > GraphQL 订阅配置错误

问题描述

美好的一天,我正在尝试制作一个简单的应用程序,当用户添加任何产品订阅者时,将触发和事件并发回产品。我在谷歌的帮助下实现了一些代码,除了订阅者之外,一切都在工作,当我浏览 graphiql 时我的浏览器看到一些错误,例如 Expected { query: { kind: "Document", definitions: [Array], loc: [Object] }, mutation: { Query: [Object], Mutation: [Object], Subscription: [Object] ], Upload: Upload } } 成为一个 GraphQL 模式。,下面是我的代码,

服务器主 index.js 文件

const express = require('express')
const morgan = require('morgan')
const cors = require('cors')
const bodyParser = require('body-parser')
const {ApolloServer, gql} = require('apollo-server-express');
const {createServer} = require('http');
const {execute, subscribe} = require('graphql');
const {makeExecutableSchema} = require('@graphql-tools/schema');
const {PubSub} = require('graphql-subscriptions');
const {SubscriptionServer} = require('subscriptions-transport-ws');
const typeDefs = require("./GraphQLSchema/typeDef")
const resolvers = require("./GraphQLSchema/resolvers")
const myGraphQLSchema = require('./GraphQLSchema');
const coreRouting = require("./routes")
require('dotenv').config()


const app = express()

app.use(bodyParser.json())

//app middleware

app.use(morgan('dev'));

//app.use(cors())

const {PrismaClient} = require("@prisma/client")

const prisma = new PrismaClient();

async function checkPrismaConnection() {
    const obj = {
        include: {transactions: true}
    }
    try {
        // const result = await prisma.product.findMany({
        //     include: {transactions: false}
        // });
        const result = await prisma.transaction.findMany();
        console.log(result);
    } catch (e) {
        console.log(e);

    }
}

//checkPrismaConnection();


app.use(coreRouting);


app.get('/test/route', (req, res) => res.send('Hello World!'))
const serverPort = process.env.PORT || 9000

app.use('/graphql', bodyParser.json());

const apolloServer = new ApolloServer(
    {
        typeDefs,
        resolvers,
        context: ({req}) => ({req, pubsub})
    });
apolloServer.applyMiddleware({app});

const pubsub = new PubSub();
const server = createServer(app);

//const schema = makeExecutableSchema({typeDefs, resolvers});

server.listen(serverPort, () => {
    new SubscriptionServer({
        execute,
        subscribe,
        pubsub,
        schema: {
            query: typeDefs,
            mutation: resolvers,

        },
        graphiql: true
    }, {
        server: server,
        path: '/graphql',
    });
});


typeDefs 代码

const {gql} = require("apollo-server-express");

module.exports = gql`
 type Post{
    body: String!
 }
 type Product{
  id: Int!
  name: String!
  transactions:[Transaction]!
 }
 
 type Transaction{
 id: Int!
 quantity: Int!
 time: String!
 }
 
 input ProductInput{
    name: String!
 }
 
 type Query {
   getPosts: [Post]
   products: [Product]
   product(id: ID!): Product
 }
 
 type Mutation {
    createProduct(productInput: ProductInput):Product!
 }
  type Subscription {
    newProduct: Product!
  }
`

解析器代码

const {helperMethodForFetcingProducts, helperMethodForCreateProduct} = require("../../helper");
const {relationalKeyword} = require("../../helper/keyword");

module.exports = {
    Query: {
        getPosts() {
            return [{"body": "First Post"}, {"body": "2nd Post"}, {"body": "3rd Post"}]
        },
        products: async function () {
            return helperMethodForFetcingProducts(relationalKeyword, false);
        },
        product: async function (_, {id}) {
            console.log(_, id);
            return helperMethodForFetcingProducts(relationalKeyword, true, parseInt(id));
        }
    },
    Mutation: {
        createProduct: async (_, {productInput: {name}}, {pubsub}) => {
            let getProductFromMethod = await helperMethodForCreateProduct(name);

            pubsub.publish('Proudct_Added', {
                newProduct: getProductFromMethod
            })
            return getProductFromMethod;
        }
    },
    Subscription: {
        newProduct: {
            subscribe: (_, __, {pubsub}) => pubsub.asyncIterator('Proudct_Added')
        }
    }
}

我的错误 在此处输入图像描述

由于我是 graphQL 的新手,我实际上并不理解这个问题。

标签: javascriptnode.jsgraphql

解决方案


推荐阅读