如果数学函数中的 nil 因算术表达式中的参数错误而下降,如何保护 nil

问题描述 投票:0回答:1

尝试弄清楚,在生成 GQL 模式时, 为什么如果源变量

:float
中存在
square_plot
数据(比如
50
), 没有错误 但如果它是 NIL,则代码会生成错误 当我使用这样的代码将值转换为sqft时:

可能看起来没有验证通过

代码

field(:square_plot, :float)     // my var is `50.0` in DB

field :square_plot_ft, :float do
  if square_plot > 0 do
    resolve(fn _args, %{source: source} -> {:ok, Float.round(source.square_plot*10.7639, 0)} end)
  end
end

如果值 NOT NIL,则 GQL 响应

{
    "data": {
        "unit": {
            "squareTotalFt": 1615.0,
            "squareTotal": 150.0,
            "squarePlotFt": 538.0,
            "squarePlot": 50.0
        }
    }
}

如果值为 NIL,则 GQL 响应

"Internal server error"

和服务器错误

** (exit) an exception was raised:
    ** (ArithmeticError) bad argument in arithmetic expression
        (platform) lib/units_web/schema/object.ex:228: anonymous fn/2 in UnitsWeb.Schema.Unit.__abs
inthe_type__/1
graphql elixir ecto
1个回答
0
投票

令人惊讶的是,在 中,因此在 中,涉及不同类型的比较

<
/
>
是合法的。

更令人惊讶的是,任何原子都大于任何数字。

nil > 0
#⇒ true

我们进入

if
,尝试
square_plot*10.7639
,即
nil*10.7639
,这显然会提高。

正确的代码是:

field :square_plot_ft, :float do
  if is_number(square_plot) and square_plot > 0 do
    resolve(...)
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.