graphQL解析器返回无法为不可为空的字段返回null。 Console.log显示正在返回的数据

时间:2019-05-17 20:57:18

标签: sqlite graphql apollo-server

无法为非空字段返回null。

我有一个graphQL解析器通过exerciseEntry,它会击中用户ID,然后在查询用户ID时尝试在其中查找用户信息。 playgound显示上面的错误。

我尝试设置对象结果以匹配用户数据,但仍然没有得到返回。

解析器:

Query: {
  getExerciseEntries: async (root, args, ctx) => {
    const entries = await ExerciseEntry.getAll();
    console.log(entries);
    return entries;
  },

  getExerciseEntryBy: async (root, args, ctx) => {
    const entry = await ExerciseEntry.findBy(args.filter);

    return entry;
  },
  getExerciseEntryById: async (root, args, ctx) => {
    const entry = await ExerciseEntry.findById(args.id);
    return entry;
  }
},
ExerciseEntry: {
  user: async (root, args, ctx, info) => {
    const user = await Users.findBy({id: root.exercise_entry_user_id})
    console.log("seeing users", user)
    return user
  }
}

TypeDefs:

type Query {
  getExerciseEntries: [ExerciseEntry!]!
  getExerciseEntryBy(filter: String!): ExerciseEntry!
  getExerciseEntryById(id: ID!): ExerciseEntry!
}

type ExerciseEntry {
  id: ID!
  date: String!
  name: String!
  caloriesBurned: Int!
  user: User!
}

type User {
  id: ID!
  firstName: String!
  lastName: String!
  username: String!
  email: String!
  userType: String!
  calorieGoal: Int!
  weight: Int
  foodEntries: [FoodEntry!]!
  exerciseEntries: [ExerciseEntry!]!
}

我希望查询在显示数据的地方起作用:

{
 "data": {
   "getExerciseEntries": [
     {
       "id": "1",
       "caloriesBurned": 100
       "user": {
         "id": 1,
         "calorieGoal": 2000   
       }  
     }
   ]
 }
}

或类似的东西。

2 个答案:

答案 0 :(得分:0)

该错误表明该字段的null标记为不可为空(在服务器端)。不确定它抱怨的是哪个字段,但是您可以通过从架构中删除所有的Non-Nullables(删除每个字段上的!)或从查询中删除所有字段并将它们添加回一个字段来开始调试。找到罪魁祸首的时间。

如果是getExerciseEntries.user字段,则此处的代码行 const user = await Users.findBy({id: root.exercise_entry_user_id}) 返回null。或者它可能是getExerciseEntries.user.calorieGoal,因为它也被标记为不可为空。

答案 1 :(得分:0)

我们有两种方法,即findBy和findById。 如果您使用的是findById,则只需

 ExerciseEntry: {
  exercise_entry_user_id: async (root, args, cxt, info) => {
   const user = await Users.findById(root.exercise_entry_user_id);
   return user;
  }
 } 

如果您使用的是findBy,则示例可能是:

User: {
 exerciseEntries: async (root, args, ctx, info) => {
  const entries = await ExerciseEntry.findBy({ exercise_entry_user_id: root.id });
  return entries;
 }
}

您只需要确保您实际上在从后端调用正确的数据即可,因此命名非常重要。另外,您的typedef必须匹配您要返回的数据。

我们的exerciseEntry Typedef是:

  type ExerciseEntry {
    id: ID!
    exerciseEntryDate: Date!
    exerciseName: String!
    caloriesBurned: Int!
    exercise_entry_user_id: User!
  }