我正在尝试实现一个graphQL API,它在查询方面做得很好,但是对于突变来说效果不是很好:
以下是使用apollo-client
和graphql-tag
的基本变异:
import gql from 'graphql-tag'
const addNewPlace = (place) => {
return client.mutate({
mutation: gql`
mutation {
addNewPlace(
input: {
$title: String!
}
) {
place { title }
}
}
`,
variables: {
title: place.title
}
})
}
这里我试图使用变量。当将突变改变为下面的突变时,它会顺利进行,但这不是正确的ID方式。
const addNewPlace = (place) => {
return client.mutate({
mutation: gql`
mutation {
addNewPlace(
input: {
title: "${place.title}"
}
) {
place { title }
}
}
`
})
}
知道我犯了哪些错误吗?
答案 0 :(得分:5)
使用变量时,您需要采取以下三个步骤:
将变量添加到正在发送的请求中。在Apollo中,通过在传递给variables
的对象中指定mutate
属性来完成。你写道:
变量:{title:place.title}
这很好。我们发送一些变量,称为title,具有任何值,以及对我们服务器的请求。此时,GraphQL甚至不知道变量。
在您的操作中声明您的变量。您不必为您的操作命名,但这样做是好的做法:
变异 AddNewPlace($ title:String) {
在这里,我们告诉GraphQL我们已经包含了一个名为title的变量。您可以将其称为任何东西(例如foo),只要它与您传递给#1中的变量prop的内容相匹配即可。这一步很重要,因为A)GraphQL需要知道变量,B)需要知道传递的变量类型。
最后,在变异中包含变量,如下所示:
addNewPlace(输入:{title:$ title}){
注意不要将步骤#2中的变量定义与步骤#3中的输入定义混淆。另外,我假设你的typeDefs包含某种input
类型,如AddNewPlaceInput。你可以传入一个像这样的对象,而不是只传入标题:
variables: { input: { title: place.title } }
然后你的突变看起来像这样:
mutation AddNewPlace($input: AddNewPlaceInput) {
addNewPlace(input: $input) {
# fields returned by the mutation
我强烈建议启用Graph i QL端点,这样您就可以在客户端实施查询和突变之前轻松测试它们。
最后,您可能需要检查并确保突变中要求的字段与您的类型定义匹配。我只是在这里猜测,但是如果您的变异解析为地方类型,那么除非您的地方类型实际上有place { title }
,否则您不需要title
,place
。 1}} field。