Size: a a a

Эликсир и Вунш

2018 October 20

V

Vladislav in Эликсир и Вунш
вот такая ошибка
источник

V

Vladislav in Эликсир и Вунш
The call 'Elixir.Phoenix.Controller':render(_conn@1::any(),'Elixir.ApiWeb.ErrorView',<<_:64>>) breaks the contract ('Elixir.Plug.Conn':t(),binary() | atom(),'Elixir.Keyword':t() | map()) -> 'Elixir.Plug.Conn':t()
источник

V

Vladislav in Эликсир и Вунш
но при этом если я из postman хожу по этому адресу, всё норм
Короче чувствую у меня скоро родится статья про то как правильно +/- готовить Mongo в Elixir)))
источник
2018 October 21

ДК

Денис Квiтковий in Эликсир и Вунш
Vladislav
но при этом если я из postman хожу по этому адресу, всё норм
Короче чувствую у меня скоро родится статья про то как правильно +/- готовить Mongo в Elixir)))
Мне как раз надо б
Жду с нетерпением :3
источник

K

Konstantin in Эликсир и Вунш
Vladislav
The call 'Elixir.Phoenix.Controller':render(_conn@1::any(),'Elixir.ApiWeb.ErrorView',<<_:64>>) breaks the contract ('Elixir.Plug.Conn':t(),binary() | atom(),'Elixir.Keyword':t() | map()) -> 'Elixir.Plug.Conn':t()
там проблема не в монге и не в tryInsertUser. Это известная бага в фениксе при использовании fallback controller
источник

K

Konstantin in Эликсир и Вунш
источник

K

Konstantin in Эликсир и Вунш
в вашем случае, скорее всего где-то используется render(conn, ErrorView, "template")
источник

K

Konstantin in Эликсир и Вунш
без параметров.
источник

K

Konstantin in Эликсир и Вунш
ищите этот вызов и меняйте на render(conn, ErrorView, "template", [])
источник

V

Vladislav in Эликсир и Вунш
Спасибо большое за наводку, посмотрел очень внимательно код, вроде исправил, даже понял почему, но всё равно как-то странно((
tryInsertUser возвращал либо
{:ok, user} либо {:error, "Some error"}
и потом вызвался render
conn |> render(ApiWeb.ErrorView, "error.json", %{status: :error, message: message})

как только изменил тип возврата с {:error, "Some error"} на {:error, %{message: "Some error"}}
всё заработало, видимо потому, что параметр стал map а не String
источник

K

Konstantin in Эликсир и Вунш
так лучше не делать. Имею в виду возвращать {:error, %{message: "erorr"}}
лучше возвращать {:error, "message"} а уже в контроллере все это распаковывать и передавать как надо в render
источник

v

vtm in Эликсир и Вунш
А если надо кроме мессаджа ещё параметры передать?
источник

V

Vladislav in Эликсир и Вунш
вообще тогда не понятно, как сделать:
возвращается {:error, "User already exist"}
то есть 2 элемент -  строка
потом я делаю так:
{:error, text} ->
conn |> render(ApiWeb.ErrorView, "error.json", %{status: :error, message: text})
и ругается на параметр

если же возвращаю
{:error, %{text: "User already exist"}}
и потом делаю
{:error, message} ->
conn |> render(ApiWeb.ErrorView, "error.json", %{status: :error, message: message[:text]})
то всё работает нормально, как и должно быть.
хотя message[:text] тоже строка и разницы по-идее быть не должно, тесты пробегают и всё ок и там и там
источник

K

Konstantin in Эликсир и Вунш
Тут нужно смотреть на весь проект, проблема не в этом конкретном методе. Где-то дальше по стеку что-то не так.
источник

K

Konstantin in Эликсир и Вунш
Или fallback или может view как-то написан не так. Приложение на каком-то уровне генерит кривой render
источник

K

Konstantin in Эликсир и Вунш
Vladislav
вообще тогда не понятно, как сделать:
возвращается {:error, "User already exist"}
то есть 2 элемент -  строка
потом я делаю так:
{:error, text} ->
conn |> render(ApiWeb.ErrorView, "error.json", %{status: :error, message: text})
и ругается на параметр

если же возвращаю
{:error, %{text: "User already exist"}}
и потом делаю
{:error, message} ->
conn |> render(ApiWeb.ErrorView, "error.json", %{status: :error, message: message[:text]})
то всё работает нормально, как и должно быть.
хотя message[:text] тоже строка и разницы по-идее быть не должно, тесты пробегают и всё ок и там и там
а можно посмотреть на ApiWeb.ErrorView ?
источник

V

Vladislav in Эликсир и Вунш
конечно, сейчас скину
источник

V

Vladislav in Эликсир и Вунш
источник

K

Konstantin in Эликсир и Вунш
1. у вас очень странный матчинг {:status => status} лучше использовать {status: status}
2. в Elixir если матчится по мапу и в нем нет полей - то это не сматчится
К примеру в вашем случае функция def render("error.json", %{:status => status, :message => message}) do не сматчится на вызов render(ApiWeb.ErrorView, "error.json", %{message: message}) так как не передан status
источник

K

Konstantin in Эликсир и Вунш
так как этот матч не срабатывает, то феникс пытается подставить туда свой внутренний render и ругается, что нарешуны правила его внутреннего рендера
источник