私は現在、Apolloクライアント用に vue-apollo パッケージを使用しており、VueJsスタックとDjango、Graphene-pythonをGraphQlAPIに使用しています。
以下のvue-apolloを使用した簡単なセットアップがあります。
import Vue from 'vue'
import { ApolloClient } from 'apollo-client'
import { HttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'
import VueApollo from 'vue-apollo'
import Cookies from 'js-cookie'
const httpLink = new HttpLink({
credentials: 'same-Origin',
uri: 'http://localhost:8000/api/',
})
// Create the apollo client
const apolloClient = new ApolloClient({
link: httpLink,
cache: new InMemoryCache(),
connectToDevTools: true,
})
export const apolloProvider = new VueApollo({
defaultClient: apolloClient,
})
// Install the vue plugin
Vue.use(VueApollo)
また、Django settings.py
に Django-cors-headers パッケージを使用してCORSを設定しています。graphiQLまたはChrome用のInsomniaAPIクライアントですが、以下のミューテーションをmy vue app:
'''
import gql from "graphql-tag";
import CREATE_USER from "@/graphql/NewUser.gql";
export default {
data() {
return {
test: ""
};
},
methods: {
authenticateUser() {
this.$apollo.mutate({
mutation: CREATE_USER,
variables: {
email: "[email protected]",
password: "pa$$Word",
username: "testuser"
}
}).then(data => {
console.log(result)
})
}
}
};
NewUser.gql
mutation createUser($email: String!, $password: String!, $username: String!) {
createUser (username: $name, password: $password, email: $email)
user {
id
username
email
password
}
}
以下のエラー応答で戻ります。
POST http://localhost:8000/api/ 400 (Bad Request)
ApolloError.js?d4ec:37 Uncaught (in promise) Error: Network error: Response not successful: Received status code 400
私のvueアプリでの定期的なクエリは、しかし、突然変異を除いて正しい応答を解決するためにうまく機能するので、これは私を本当に困惑させます
400エラーは通常、クエリ自体に問題があることを意味します。この例では、$username
という変数を定義しました(そして渡します)。ただし、クエリでは2行目でそれを$name
として参照しています。
GraphiQLに加えて、apollo-link-errorパッケージも大いに役立ったであろうことを付け加えたいと思います。エラーハンドラー{onError}をインポートすることで、ネットワークおよびアプリケーション(graphql)レベルで生成されたエラーに関する詳細をコンソールから取得できます。
import { onError } from 'apollo-link-error';
import { ApolloLink } from 'apollo-link';
const errorLink = onError(({ graphQLErrors, networkError }) => {
if (graphQLErrors) {
console.log('graphQLErrors', graphQLErrors);
}
if (networkError) {
console.log('networkError', networkError);
}
});
const httpLink = ...
const link = ApolloLink.from([errorLink, httpLink]);
const client = new ApolloClient({
...,
link,
...
});
Apolloクライアントをインスタンス化する場所にこの構成を追加すると、次のようなエラーが発生します。
GraphQLError {メッセージ: "構文エラー:予期された{、見つかった名前" createUser ""}
詳細については、Apollo Doc-エラー処理: https://www.apollographql.com/docs/react/features/error-handling を参照してください。それが将来役立つことを願っています。
それがまさにあなたが送っているものであるならば、確かに突然変異は正しくフォーマットされていません。突然変異には開き角かっこが必要です
mutation createUser($email: String!, $password: String!, $username: String!) {
createUser (username: $name, password: $password, email: $email) {
user {
id
username
email
password
}
}
}
これらのクエリのいずれかでバグが発生した場合、それをgraphiqlまたはgraphqlプレイグラウンドに貼り付けて、フォーマットエラーが何であるかを特定し、何が問題であるかを特定します。
私にとっては、GraphQLスキーマで定義されていないフィールドを使用していたという事実でした。常に注意してください!