变量'$方向';不能是非输入类型';[步骤';GraphQL阿波罗客户端
我是一个gql的初学者,对于任何可能导致这个问题的基本错误都一无所知 我有一个通过Netlify函数向FaunaDB触发的突变,它返回上述错误(下面是完整错误)。查询与错误一起工作使我相信问题在于 我试图在apollo客户端选项中定义typeDefs选项,经过几轮鸟枪调试后,我的client.js目前看起来是这样的变量'$方向';不能是非输入类型';[步骤';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
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'对象)总是比较安全的()谢谢你的指点。我会尽快看一看