GraphQL查询返回null。不确定为什么

时间:2020-02-26 19:40:42

标签: graphql knex.js sqldatasource apollo-server

我在返回null的graphQL查询时遇到了一些麻烦,但我不确定为什么它返回null。我读过几篇与此帖子类似的帖子,但是这些帖子都没有帮助您确定我的确切问题。

我认为这与我传递/获取参数有关,因为没有参数的查询工作正常,但是我不确定,因为我无法在线找到其他示例。

任何帮助将不胜感激。

我正在使用apollo服务器,graphql和一个community SQL datasource implementation,后者使用Knex创建数据库连接。

我可以进行两个查询。

  1. allParts()-此查询可正常工作,并返回数据库中具有请求的graphQL字段的所有零件
  2. getPart(itemnum)-这是当前无法使用的查询。

graphQL查询:

query{
  getPart(itemnum: "T|0000000000001"){
    desc
  }
}

graphQL响应:

"message": "Cannot return null for non-nullable field Part.desc.",

基于Knex调试消息正在执行的SQL查询:

method: 'select',
  options: {},
  timeout: false,
  cancelOnTimeout: false,
  bindings: [ 'T|0000000000001' ],
  __knexQueryUid: '3a8234eb-0a5c-46db-ad8e-5508288c9a86',
  sql: 'select * from `part` where `itemnum` = ?'

index.js:

const { ApolloServer } = require('apollo-server');
const typeDefs = require('./schema');
const resolvers = require ('./resolvers')
const PartAPI = require ('./datasources/partAPI');

const knexConfig = {
  client: "sqlite3",
  connection: {
    /* CONNECTION INFO */
    filename: "./TEAM_material.db3"
  },
  debug: true
};



const server = new ApolloServer({ 
    typeDefs,
    resolvers,
    dataSources: () => ({
      partAPI: new PartAPI(knexConfig),
    }),
    introspection: true,
 });

server.listen().then(({ url }) => {
    console.log(`? Server ready at ${url}`);
  });

partAPI.js:

const { SQLDataSource } = require("datasource-sql");



const MINUTE = 60;

class PartAPI extends SQLDataSource {

    getPart(itemnum){
        return this.knex.select('*').from('part').where({itemnum});
    }

    getAllParts(){
        const query = this.knex.select('*').from('part').cache(MINUTE);
        console.log (query);
        return query;
    }
}

module.exports = PartAPI;

schema.js

// src/schema.js

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

const typeDefs = gql`
#Types
    type Part {
        itemnum: String!
        desc: String!
        vendor: String!
        manuf: String!
        venlist: Float!
        price: Float!
        teamlist: Float!
        teamsell: Float!
        unitypart: String!
        pkgqty: Int!
        ioType: String!
        preferred: Boolean!
        filterlvl1: String!
        filterlvl2: String!
        filterlvl3: String!
        filterlvl4: String!
        ipwiretype: String!
        opwiretype: String!
        obsolete: Boolean!
    }
#Queries
    type Query {
        getPart(itemnum: String!): Part
        allParts: [Part!]!
    }
`;

module.exports = typeDefs

resolvers.js

// src/resolvers.js

const resolvers = {
    Query: {
       getPart: (_,args,{dataSources}) => dataSources.partAPI.getPart(args.itemnum),
       allParts: (_,__,{dataSources}) => dataSources.partAPI.getAllParts(),
      },
};

module.exports = resolvers

1 个答案:

答案 0 :(得分:1)

证明我的架构不正确。 getPart查询期望使用Part,但是我的查询返回的是Part数组。

旧架构

#Queries
    type Query {
        getPart(itemnum: String!): Part
        allParts: [Part!]!
    }
`;

新架构

#Queries
    type Query {
        getPart(itemnum: String!): [Part]!
        allParts: [Part!]!
    }
`;
相关问题