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 创建数据库连接。
我可以进行两个查询。
- allParts() - 此查询按预期工作,returns 我数据库中的所有部分都带有请求的 graphQL 字段
- 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!]!
}
`;
我在 graphQL 查询返回 null 时遇到了一些问题,我不太确定它为什么返回 null。我读过几本与此 post 类似的 post,但其中 post 的 none 帮助确定了我的确切问题。
我认为这与我如何使用 passing/getting 参数有关,因为我的不带参数的查询工作正常,但我不确定,因为我在网上找不到任何其他示例。
如有任何帮助,我们将不胜感激。
我正在使用 apollo-server、graphql 和 community SQL datasource implementation,后者使用 Knex 创建数据库连接。
我可以进行两个查询。
- allParts() - 此查询按预期工作,returns 我数据库中的所有部分都带有请求的 graphQL 字段
- 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!]!
}
`;