GraphQL 查询返回空值。不知道为什么

GraphQL Query returning null. Not sure why though

我在 graphQL 查询返回 null 时遇到了一些问题,我不太确定它为什么返回 null。我读过几本与此 post 类似的 post,但其中 post 的 none 帮助确定了我的确切问题。

我认为这与我如何使用 passing/getting 参数有关,因为我的不带参数的查询工作正常,但我不确定,因为我在网上找不到任何其他示例。

如有任何帮助,我们将不胜感激。

我正在使用 apollo-server、graphql 和 community SQL datasource implementation,后者使用 Knex 创建数据库连接。

我可以进行两个查询。

  1. allParts() - 此查询按预期工作,returns 我数据库中的所有部分都带有请求的 graphQL 字段
  2. getPart(itemnum) - 这是当前不工作的查询。

graphQL 查询:

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

graphQL 响应:

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

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

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

原来我的架构不正确。 getPart 查询需要一个 Part,但我的查询返回的是一个 Part 数组。

旧架构

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

新架构

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