- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 absinthe 中有很多可用于处理错误元组的指南。但在异常(exception)情况下接近零。
这很重要,因为总会有无法预料的问题,这些问题可能会引发异常并返回不符合 graphql 的响应。响应/错误规范。当 GraphQL 客户端喜欢 apollo 时,这尤其成问题。自动批处理请求,一个查询中的异常将使整个 BEAM 网络进程崩溃,导致所有查询失败。
我的第一个想法是使用中间件将解析器包装在 try/rescue
block 中,我遇到的仅有的两个链接也提出了类似的方法:
Elixir 论坛: How to use Absinthe.MiddleWare to catch exception?
Ben Wilson,Absinthe 的创建者之一,建议将 Resolution
中间件替换为在 try
block 中执行解析器的自定义中间件
这不会处理其他中间件中的异常(但也许它应该是这样的)
博客文章: Handling Elixir Exceptions in Absinthe using Middleware
Absinthe.Middleware
行为规范我的方法有点受到博客文章的启发,但我尝试遵循该行为并使用中间件元组规范而不是匿名函数:
中间件定义:
defmodule MyApp.ExceptionMiddleware do
@behaviour Absinthe.Middleware
@default_error {:error, :internal_server_error}
@default_config []
@spec wrap(Absinthe.Middleware.spec()) :: Absinthe.Middleware.spec()
def wrap(middleware_spec) do
{__MODULE__, [handle: middleware_spec]}
end
@impl true
def call(resolution, handle: middleware_spec) do
execute(middleware_spec, resolution)
rescue
error ->
Sentry.capture_exception(error, __STACKTRACE__)
Absinthe.Resolution.put_result(resolution, @default_error)
end
# Handle all the ways middleware can be defined
defp execute({{module, function}, config}, resolution) do
apply(module, function, [resolution, config])
end
defp execute({module, config}, resolution) do
apply(module, :call, [resolution, config])
end
defp execute(module, resolution) when is_atom(module) do
apply(module, :call, [resolution, @default_config])
end
defp execute(fun, resolution) when is_function(fun, 2) do
fun.(resolution, @default_config)
end
end
在架构中应用它:
wrap/1
方法在所有查询/变异中间件上调用
def middleware(middleware, _field, %{identifier: type}) when type in [:query, :mutation] do
Enum.map(middleware, &ExceptionMiddleware.wrap/1)
end
结果:
将它们转换为:
[
{ExceptionMiddleware, handle: {AuthMiddleware, [access: :admin]}},
{ExceptionMiddleware, handle: {{Resolution, :call}, &some_resolver/3}},
{ExceptionMiddleware, handle: {Subscription, []}},
{ExceptionMiddleware, handle: &anon_middleware/2},
]
我仍然对我的方法没有完全的信心,因为这感觉有点老套并且是对 absinthe 中间件的误用。因此,我有兴趣获得以下几个问题的答案:
Absinthe.Resolution
中间件是否有意义?最佳答案
关于elixir - 处理 Absinthe 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57491077/
问题 在 absinthe 中有很多可用于处理错误元组的指南。但在异常(exception)情况下接近零。 这很重要,因为总会有无法预料的问题,这些问题可能会引发异常并返回不符合 graphql 的响
安装 absinthe_plug 后出现以下错误: = Compilation error in file lib/kerrigan_api_web/router.ex == ** (Undefine
定义并非所有用户都可以访问的字段的正确方法是什么。 例如,普通用户可以查询用户并找到其他用户的句柄,但只有管理员用户才能找到他们的电子邮件地址。用户类型将其定义为字段,但可能无法访问。是否应该有一个单
我试图在我的 graphql 实现中接收一串 JSON,但是我定义的用于处理 JSON 的自定义标量不断出现错误。 我已经定义了一个自定义标量来正确地将 JSON 序列化为 elixir 映射。在我的
我在 Absinthe 中使用内置的 GraphiQL 界面。如下: pipeline :browser do plug RemoteIp, headers: ~w[x-forwarded
我是一名优秀的程序员,十分优秀!