Я использую GraphQL с клубникой в своем проекте Django. Когда возникает исключение, ошибка отображается в терминале, как и ошибки сервера. Но если пользователь допустил ошибку при создании запроса, это не должно отображаться так. Вот одна из ошибок.
GraphQL request:18:5
17 | # }
18 | register(name: "Mahmuud Hasan", email: "test@gmail.com", password: "admin"){
| ^
19 | success
Traceback (most recent call last):
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/graphql/execution/execute.py", line 523, in execute_field
result = resolve_fn(source, info, **args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver
return _get_result_with_extensions(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver
return reduce(
^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result
return _get_result(
^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result
return field.get_result(
^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/types/field.py", line 232, in get_result
return self.base_resolver(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/types/fields/resolver.py", line 250, in __call__
return self.wrapped_func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mahmud/Projects/Alyve/main/mutations.py", line 47, in register
raise GraphQLError("Email already in use.", extensions={"code": "BAD_USER_INPUT"})
graphql.error.graphql_error.GraphQLError: Email already in use.
Я не хочу показывать подобные ошибки в своем терминале. Я пытался создавать собственные сообщения об ошибках и возвращал их в качестве ответа вместо того, чтобы создавать исключения. Но внешний разработчик использует клиент Apollo, и он не сможет распознать ошибки, если я не сделаю это с помощью исключения.
Ответ, который я возвращаю из серверной части, всегда поступает в блок данных, но он ожидает данные поля ошибок, которые показывают, если я вызываю исключение.
Я также пытался использовать Strawberry.extensions.SchemaExtension, чтобы скрыть ошибки. Но ошибки выводятся до запуска функции on_operation.
Мой код Schema.py:
import strawberry
from .queries import Query
from .mutations import Mutation
from strawberry.extensions import SchemaExtension
from graphql import GraphQLError
class CustomErrorHandlingExtension(SchemaExtension):
def on_operation(self):
yield
result = self.execution_context.result
print("Execution result:", result)
print("Execution errors:", result.errors if result else "No result")
if result and result.errors:
for error in result.errors:
if not isinstance(error.original_error, GraphQLError):
error.message = "An unexpected error occurred. Please try again later."
error.extensions = {"code": "INTERNAL_SERVER_ERROR"}
schema = strawberry.Schema(query=Query, mutation=Mutation, extensions=[CustomErrorHandlingExtension])
Я использую GraphQL с клубникой в своем проекте Django. Когда возникает исключение, ошибка отображается в терминале, как и ошибки сервера. Но если пользователь допустил ошибку при создании запроса, это не должно отображаться так. Вот одна из ошибок. [code]GraphQL request:18:5 17 | # } 18 | register(name: "Mahmuud Hasan", email: "test@gmail.com", password: "admin"){ | ^ 19 | success Traceback (most recent call last): File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/graphql/execution/execute.py", line 523, in execute_field result = resolve_fn(source, info, **args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver return _get_result_with_extensions( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver return reduce( ^^^^^^^ File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result return _get_result( ^^^^^^^^^^^^ File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result return field.get_result( ^^^^^^^^^^^^^^^^^ File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/types/field.py", line 232, in get_result return self.base_resolver(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/types/fields/resolver.py", line 250, in __call__ return self.wrapped_func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/mahmud/Projects/Alyve/main/mutations.py", line 47, in register raise GraphQLError("Email already in use.", extensions={"code": "BAD_USER_INPUT"}) graphql.error.graphql_error.GraphQLError: Email already in use. [/code] Я не хочу показывать подобные ошибки в своем терминале. Я пытался создавать собственные сообщения об ошибках и возвращал их в качестве ответа вместо того, чтобы создавать исключения. Но внешний разработчик использует клиент Apollo, и он не сможет распознать ошибки, если я не сделаю это с помощью исключения. [code]{ "data": null, "errors": [ { "message": "Email already in use.", "locations": [ { "line": 18, "column": 5 } ], "path": [ "register" ], "extensions": { "code": "BAD_USER_INPUT" } } ] } [/code] Ответ, который я возвращаю из серверной части, всегда поступает в блок данных, но он ожидает данные поля ошибок, которые показывают, если я вызываю исключение. Я также пытался использовать Strawberry.extensions.SchemaExtension, чтобы скрыть ошибки. Но ошибки выводятся до запуска функции on_operation. Мой код Schema.py: [code]import strawberry from .queries import Query from .mutations import Mutation from strawberry.extensions import SchemaExtension from graphql import GraphQLError
class CustomErrorHandlingExtension(SchemaExtension): def on_operation(self): yield result = self.execution_context.result print("Execution result:", result) print("Execution errors:", result.errors if result else "No result") if result and result.errors: for error in result.errors: if not isinstance(error.original_error, GraphQLError): error.message = "An unexpected error occurred. Please try again later." error.extensions = {"code": "INTERNAL_SERVER_ERROR"}
schema = strawberry.Schema(query=Query, mutation=Mutation, extensions=[CustomErrorHandlingExtension]) [/code] А вот ответ об ошибке [code]GraphQL request:18:5 17 | # } 18 | register(name: "Mahmuud Hasan", email: "test@gmail.com", password: "admin"){ | ^ 19 | success Traceback (most recent call last): File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/graphql/execution/execute.py", line 523, in execute_field result = resolve_fn(source, info, **args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver return _get_result_with_extensions( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver return reduce( ^^^^^^^ File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result return _get_result( ^^^^^^^^^^^^ File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result return field.get_result( ^^^^^^^^^^^^^^^^^ File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/types/field.py", line 232, in get_result return self.base_resolver(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/mahmud/Projects/Alyve/env/lib/python3.12/site-packages/strawberry/types/fields/resolver.py", line 250, in __call__ return self.wrapped_func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/mahmud/Projects/Alyve/main/mutations.py", line 47, in register raise GraphQLError("Email already in use.", extensions={"code": "BAD_USER_INPUT"}) graphql.error.graphql_error.GraphQLError: Email already in use. Execution result: ExecutionResult(data=None, errors=[GraphQLError('Email already in use.', locations=[SourceLocation(line=18, column=5)], path=['register'], extensions={'code': 'BAD_USER_INPUT'})]) Execution errors: [GraphQLError('Email already in use.', locations=[SourceLocation(line=18, column=5)], path=['register'], extensions={'code': 'BAD_USER_INPUT'})] [/code] Я также пытался переопределить функцию отчета об ошибках, но она тоже не работает. [code]from strawberry.django.views import GraphQLView
for error in errors: if isinstance(error.original_error, GraphQLError): logger.info(f"GraphQL Validation Error: {error.message}") else: filtered_errors.append(error)
if filtered_errors: super().report_errors(filtered_errors, result) [/code] Я не могу найти правильное решение этой проблемы. Как я могу скрыть эти ошибки?