变量'$方向';不能是非输入类型';[步骤';GraphQL阿波罗客户端

变量'$方向';不能是非输入类型';[步骤';GraphQL阿波罗客户端,graphql,apollo-client,graphql-js,faunadb,Graphql,Apollo Client,Graphql Js,Faunadb,我是一个gql的初学者,对于任何可能导致这个问题的基本错误都一无所知 我有一个通过Netlify函数向FaunaDB触发的突变,它返回上述错误(下面是完整错误)。查询与错误一起工作使我相信问题在于 我试图在apollo客户端选项中定义typeDefs选项,经过几轮鸟枪调试后,我的client.js目前看起来是这样的 const { API_URL } = require("./constants"); const fetch = require("cross-fet

我是一个gql的初学者,对于任何可能导致这个问题的基本错误都一无所知

我有一个通过Netlify函数向FaunaDB触发的突变,它返回上述错误(下面是完整错误)。查询与错误一起工作使我相信问题在于

我试图在apollo客户端选项中定义typeDefs选项,经过几轮鸟枪调试后,我的client.js目前看起来是这样的

const { API_URL } = require("./constants");
const fetch = require("cross-fetch");
require("dotenv").config();

const typeDefs = gql`
  extend type Ingredient {
    name: String!
    amount: String!
    unit: String!
  }

  extend type Step {
    text: String!
    timer: Int!
  }
`;

const cleanTypeName = new ApolloLink((operation, forward) => {
  if (operation.variables) {
    const omitTypename = (key, value) => (key === "__typename" ? undefined : value);
    operation.variables = JSON.parse(JSON.stringify(operation.variables), omitTypename);
  }
  return forward(operation).map((data) => {
    return data;
  });
});

const getClient = ({ method = "POST" } = {}) => {
  const client = new ApolloClient({
    link: new HttpLink({
      cleanTypeName,
      uri: API_URL,
      fetch,
      headers: {
        Authorization: `Bearer ${process.env.FAUNADB_SERVER_SECRET}`,
      },
      method,
    }),
    cache: new InMemoryCache({ addTypename: false }),
    typeDefs,
  });
  return client;
};
module.exports = { getClient };

我的Netlify函数是这样的

const { CREATE_RECIPE } = require("./utils/queries");
const { getClient } = require("./utils/client");
exports.handler = async (event, context, callback) => {
  try {
    const client = getClient({ method: "PUT" });
    let { data } = await client.mutate({
      mutation: CREATE_RECIPE,
      variables: { ...JSON.parse(event.body) },
    });
    const result = data.createRecipe;
    return {
      statusCode: 200,
      body: JSON.stringify(result),
    };
  } catch (error) {
//return actual error for now
    throw error;
    return {
      statusCode: 500,
      body: JSON.stringify("Something went wrong while crating the cookbook. Try again later."),
    };
  }
};

const CREATE_RECIPE = gql`
  mutation CreateRecipe(
    $ownerid: ID!
    $cookbookid: [ID]!
    $name: String!
    $tags: [String]!
    $rating: Int!
    $categories: [String]!
    $images: [String]!
    $directions: [Step!]!
    $ingredients: [Ingredient!]!
  ) {
    createRecipe(
      data: {
        owner: { connect: $ownerid }
        cookbooks: { connect: $cookbookid }
        name: $name
        tags: $tags
        rating: $rating
        categories: $categories
        images: $images
        directions: $directions
        ingredients: $ingredients
      }
    ) {
      name
      owner {
        email
      }
    }
  }
  owner: User! @relation
  cookbooks: [Cookbook!]! @relation
  name: String!
  ingredients: [Ingredient!]!
  directions: [Step!]!
  tags: [String]!
  rating: Int!
  categories: [String]!
  images: [String]
}

type Ingredient @embeded {
  name: String!
  amount: String!
  unit: String!
}

type Step @embeded {
  text: String!
  timer: Int!
}
最后,突变是这样的

const { CREATE_RECIPE } = require("./utils/queries");
const { getClient } = require("./utils/client");
exports.handler = async (event, context, callback) => {
  try {
    const client = getClient({ method: "PUT" });
    let { data } = await client.mutate({
      mutation: CREATE_RECIPE,
      variables: { ...JSON.parse(event.body) },
    });
    const result = data.createRecipe;
    return {
      statusCode: 200,
      body: JSON.stringify(result),
    };
  } catch (error) {
//return actual error for now
    throw error;
    return {
      statusCode: 500,
      body: JSON.stringify("Something went wrong while crating the cookbook. Try again later."),
    };
  }
};

const CREATE_RECIPE = gql`
  mutation CreateRecipe(
    $ownerid: ID!
    $cookbookid: [ID]!
    $name: String!
    $tags: [String]!
    $rating: Int!
    $categories: [String]!
    $images: [String]!
    $directions: [Step!]!
    $ingredients: [Ingredient!]!
  ) {
    createRecipe(
      data: {
        owner: { connect: $ownerid }
        cookbooks: { connect: $cookbookid }
        name: $name
        tags: $tags
        rating: $rating
        categories: $categories
        images: $images
        directions: $directions
        ingredients: $ingredients
      }
    ) {
      name
      owner {
        email
      }
    }
  }
  owner: User! @relation
  cookbooks: [Cookbook!]! @relation
  name: String!
  ingredients: [Ingredient!]!
  directions: [Step!]!
  tags: [String]!
  rating: Int!
  categories: [String]!
  images: [String]
}

type Ingredient @embeded {
  name: String!
  amount: String!
  unit: String!
}

type Step @embeded {
  text: String!
  timer: Int!
}
Fanular端的相关schema.gql如下所示

const { CREATE_RECIPE } = require("./utils/queries");
const { getClient } = require("./utils/client");
exports.handler = async (event, context, callback) => {
  try {
    const client = getClient({ method: "PUT" });
    let { data } = await client.mutate({
      mutation: CREATE_RECIPE,
      variables: { ...JSON.parse(event.body) },
    });
    const result = data.createRecipe;
    return {
      statusCode: 200,
      body: JSON.stringify(result),
    };
  } catch (error) {
//return actual error for now
    throw error;
    return {
      statusCode: 500,
      body: JSON.stringify("Something went wrong while crating the cookbook. Try again later."),
    };
  }
};

const CREATE_RECIPE = gql`
  mutation CreateRecipe(
    $ownerid: ID!
    $cookbookid: [ID]!
    $name: String!
    $tags: [String]!
    $rating: Int!
    $categories: [String]!
    $images: [String]!
    $directions: [Step!]!
    $ingredients: [Ingredient!]!
  ) {
    createRecipe(
      data: {
        owner: { connect: $ownerid }
        cookbooks: { connect: $cookbookid }
        name: $name
        tags: $tags
        rating: $rating
        categories: $categories
        images: $images
        directions: $directions
        ingredients: $ingredients
      }
    ) {
      name
      owner {
        email
      }
    }
  }
  owner: User! @relation
  cookbooks: [Cookbook!]! @relation
  name: String!
  ingredients: [Ingredient!]!
  directions: [Step!]!
  tags: [String]!
  rating: Int!
  categories: [String]!
  images: [String]
}

type Ingredient @embeded {
  name: String!
  amount: String!
  unit: String!
}

type Step @embeded {
  text: String!
  timer: Int!
}
编辑:完全错误

mutation CreateRecipe($ownerid: ID!, $cookbookid: [ID]!, $name: String!, $tags: [String]!, $rating: Int!, $categories: [String]!, $images: [String]!, $directions: [Step!]!, $ingredients: [Ingredient!]!) {
                                                                                                                                                                   ^
Variable '$ingredients' cannot be non input type '[Ingredient!]!'. (line 1, column 188):
mutation CreateRecipe($ownerid: ID!, $cookbookid: [ID]!, $name: String!, $tags: [String]!, $rating: Int!, $categories: [String]!, $images: [String]!, $directions: [Step!]!, $ingredients: [Ingredient!]!) {
                                                                                                                                                                                           ^
  ation CreateRecipe($ownerid: ID!, $cookbookid: [ID]!, $name: String!, $tags: [String]!, $rating: Int!, $categories: [String]!, $images: [String]!, $directions: [Step!]!, $ingredients: [Ingredient!]!) {
  
  iable '$ingredients' cannot be non input type '[Ingredient!]!'. (line 1, column 188):
  ation CreateRecipe($ownerid: ID!, $cookbookid: [ID]!, $name: String!, $tags: [String]!, $rating: Int!, $categories: [String]!, $images: [String]!, $directions: [Step!]!, $ingredients: [Ingredient!]!) {
  
  new ApolloError (C:\Users\phili\Documents\Projects\cookbook\node_modules\@apollo\client\errors\errors.cjs.js:31:28)
  Object.next (C:\Users\phili\Documents\Projects\cookbook\node_modules\@apollo\client\core\core.cjs.js:1043:53)
  notifySubscription (C:\Users\phili\Documents\Projects\cookbook\node_modules\zen-observable\lib\Observable.js:135:18)
  onNotify (C:\Users\phili\Documents\Projects\cookbook\node_modules\zen-observable\lib\Observable.js:179:3)
  SubscriptionObserver.next (C:\Users\phili\Documents\Projects\cookbook\node_modules\zen-observable\lib\Observable.js:235:7)
  C:\Users\phili\Documents\Projects\cookbook\node_modules\@apollo\client\utilities\utilities.cjs.js:946:68
  Array.forEach (<anonymous>)
  iterateObserversSafely (C:\Users\phili\Documents\Projects\cookbook\node_modules\@apollo\client\utilities\utilities.cjs.js:946:25)
  Object.next (C:\Users\phili\Documents\Projects\cookbook\node_modules\@apollo\client\utilities\utilities.cjs.js:1020:21)
  notifySubscription (C:\Users\phili\Documents\Projects\cookbook\node_modules\zen-observable\lib\Observable.js:135:18)
CreateRecipe($ownerid:ID!,$cookbookid:[ID]!,$name:String!,$tags:[String]!,$rating:Int!,$categories:[String]!,$images:[String],$directions:[Step!],$contracents:[contracents!!){
^
变量“$Components”不能是非输入类型“[Components!!”(第1行第188列):
变异CreateRecipe($ownerid:ID!,$cookbookid:[ID]!,$name:String!,$tags:[String]!,$rating:Int!,$categories:[String]!,$images:[String]!,$directions:[Step!],$components:[component!!){
^
ation CreateRecipe($ownerid:ID!、$cookbookid:[ID]!、$name:String!、$tags:[String]!、$rating:Int!、$categories:[String]!、$images:[String]!、$directions:[Step!]、$components:[component!!){
可输入的“$Components”不能是非输入类型“[Components!!”(第1行,第188列):
ation CreateRecipe($ownerid:ID!、$cookbookid:[ID]!、$name:String!、$tags:[String]!、$rating:Int!、$categories:[String]!、$images:[String]!、$directions:[Step!]、$components:[component!!){
新的阿波罗错误(C:\Users\phili\Documents\Projects\cookbook\node\u modules\@apollo\client\errors\errors.cjs.js:31:28)
Object.next(C:\Users\phili\Documents\Projects\cookbook\node\u modules\@apollo\client\core\core.cjs.js:1043:53)
notifySubscription(C:\Users\phili\Documents\Projects\cookbook\node\u modules\zen observable\lib\observable.js:135:18)
onNotify(C:\Users\phili\Documents\Projects\cookbook\node\u modules\zen observable\lib\observable.js:179:3)
SubscriptionObserver.next(C:\Users\phili\Documents\Projects\cookbook\node\u modules\zen observable\lib\observable.js:235:7)
C:\Users\phili\Documents\Projects\cookbook\node\u modules\@apollo\client\utilities\utilities.cjs:946:68
Array.forEach()
iterateObserversSafely(C:\Users\phili\Documents\Projects\cookbook\node\U modules\@apollo\client\utilities\utilities.cjs:946:25)
Object.next(C:\Users\phili\Documents\Projects\cookbook\node\u modules\@apollo\client\utilities\utilities.cjs.js:1020:21)
notifySubscription(C:\Users\phili\Documents\Projects\cookbook\node\u modules\zen observable\lib\observable.js:135:18)

您应该添加错误消息,并解释如何在问题正文中获得它。乍一看,
$directions
似乎不包含预期的类型。如果没有更多上下文,很难进一步调试。看看它可能会教给您一些有关FQL/GQL的技巧:)谢谢您的评论和链接,我会检查它t!我还添加了完整的错误。它没有说太多,这可能是我调试它非常困难的原因:)从
CreateRecipe
中读取
输入类型
,在操场上从
CreateRecipe
突变规范/docs…使用'main'
data
输入类型变量(在变量中传递一个复杂的'data'对象)总是比较安全的()谢谢你的指点。我会尽快看一看