[解決済み] 変異を行う際に「Cannot return null for non-nullable field」エラーが発生するのはなぜですか?重複
質問
私はサーバー側で(Apollo)GraphQLに挑戦しているのですが、おそらく馬鹿げた問題が発生しています。ユーザーを登録しようとしているのですが、下のリンク画像にあるようなエラーが出続けています。何が問題なのでしょうか?私はGraphQlをテストしているだけなので、非常にシンプルな認証フローは無視してください。
以下は、関連するコードスニペットです。
スキーマ
export default `
type User {
id: ID!
name: String!
email: String!
}
type Query {
allUsers: [User]
currentUser: User
}
type Mutation {
createAccount(name: String!, email: String!, password: String!): User
loginUser(email: String!, password: String!): User
updatePassword(email: String!, password: String!, newPassword: String!): User
deleteAccount(email: String!, password: String!): User
}
`
リゾルバ
createAccount: async (
parent,
{ name, email, password },
{ User },
info
) => {
try {
// Check for invalid (undefined) credentials
if (!name || !email || !password) {
return 'Please provide valid credentials';
}
// Check if there is a user with the same email
const foundUser = await User.findOne({ email });
if (foundUser) {
return 'Email is already in use';
}
// If no user with email create a new user
const hashedPassword = await bcrypt.hash(password, 10);
await User.insert({ name, email, password: hashedPassword });
const savedUser = await User.findOne({ email });
return savedUser;
} catch (error) {
return error.message;
}
},
解決方法は?
このリゾルバの最大の問題は、様々なシナリオで
User
オブジェクトを返すのではなく、文字列を返しています。スキーマでは
createAccount
を返すことができます。
User
または
null
(であった場合
User!
であれば、non-nullableとなり、その後
null
も有効な型ではありません)。
リゾルバで文字列を返すと、リゾルバはオブジェクトを期待しているので、それを1つにまとめ、それから
User
のように)そのオブジェクトの
name
と
email
). これらのプロパティは存在せず、あなたの
User
オブジェクトに対して null/undefined を返すと、エラーになります。
リゾルバはおそらく、投げる必要のあるエラーは何でも投げるべきでしょう。そして、それらのエラーは
errors
を配列で返します。たとえば
// Check if there is a user with the same email
const foundUser = await User.findOne({ email })
if (foundUser) throw new Error('Email is already in use')
// If no user with email create a new user
const hashedPassword = await bcrypt.hash(password, 10);
await User.insert({ name, email, password: hashedPassword });
const savedUser = await User.findOne({ email });
return savedUser;
さて、メールが重複している場合、応答は次のようになります。
{
"data": {
"createAccount": null
},
"errors": [
{
"message": "Email is already in use",
"locations": [
{
"line": 4,
"column": 3
}
],
"path": [
"createAccount"
]
}
]
}
クライアントに表示されるエラーの内容を変更したい場合には
formatError
または
formatResponse
をApolloサーバーミドルウェアの設定オプションとして使用します。また、カスタムエラーを使用するのもよい方法です。
code
を使用すると、クライアント側でエラーの種類をより簡単に特定することができます。
最後に、name、email、passwordがリゾルバ内で定義されているかどうかを確認する必要はありません。スキーマにはすでにこれらの入力がnon-nullとしてマークされているので、GraphQLはこれらのいずれかが欠けている場合に自動的にエラーを返します。
関連
-
[解決済み】JavaScriptで':'(コロン)は何をするのか?
-
[解決済み】Uncaught TypeError: nullのプロパティ'value'を読み取ることができない
-
[解決済み] 解決済み】clearInterval()が動作しない [重複] [重複]
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み】ある要素が可視DOMに存在するかどうかを確認するにはどうすればいいですか?
-
[解決済み】コンソールがUnterminated JSX contentsエラーを投げる【終了しました
-
[解決済み】React、Uncaught ReferenceError。ReactDOMは定義されていません
-
[解決済み】DOMException: サポートされているソースが見つからなかったため、読み込みに失敗しました。
-
[解決済み] Uncaught (in promise) TypeError: フェッチに失敗してCorsエラー
-
[解決済み] TypeScript getting error TS2304: cannot find name ' require'.
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: 'undefined'はオブジェクトではありません。
-
[解決済み] 解決済み】clearInterval()が動作しない [重複] [重複]
-
[解決済み】XMLHttpRequestモジュールが定義されていない/見つからない
-
[解決済み】Javascriptのコールバック関数がFirefoxで「Callback is not a function」というエラーを投げる
-
[解決済み】ある要素を別の要素に移動させるには?
-
[解決済み】Uncaught ReferenceError。Reactが定義されていない
-
[解決済み] エラー。モジュールhtmlが見つからない
-
[解決済み】React-Routerの子が1つしかない。
-
[解決済み】WebSocket接続に失敗しました。WebSocket のハンドシェイク中にエラーが発生しました。予期しない応答コードです。400
-
[解決済み】Jestが予期しないトークンに遭遇した