路由到从数据库中获取的控制器,returns 导致 http 响应

Route to controller which fetches from database and returns results in http response

我想要一个从数据库 table 和 returns 获取所有条目的路由。

在 router.ex:

  get "/categories/" do
    [controller] = ["repo"]
    Api.Repo.getCategories(conn, controller)
  end

在repo.ex中:

  def getCategories(conn, controller) do
    conn
    start_link
    categories = Api.Category |> all
    |> put_resp_content_type("application/json")
    |> send_resp(200, categories)
  end

Api.Category.ex

defmodule Api.Category do
  use Ecto.Schema

  schema "categories" do
    field :name, :string
  end

  def changeset(category, params \ %{}) do
    category
    |> Ecto.Changeset.cast(params, [:name])
    |> Ecto.Changeset.validate_required([:name])
  end
end

我收到这些警告和错误:

warning: variable conn in code block has no effect as it is never returned (remove the variable or a
ssign it to _ to avoid warnings)
  lib/api/repo.ex:174

warning: variable "start_link" does not exist and is being expanded to "start_link()", please use pa
rentheses to remove the ambiguity or change the variable name
  lib/api/repo.ex:175

warning: variable "categories" does not exist and is being expanded to "categories()", please use pa
rentheses to remove the ambiguity or change the variable name
  lib/api/repo.ex:178

warning: variable "controller" is unused
  lib/api/repo.ex:173

warning: variable "categories" is unused
  lib/api/repo.ex:176


== Compilation error on file lib/api/repo.ex ==
** (CompileError) lib/api/repo.ex:178: undefined function categories/0
    (stdlib) lists.erl:1338: :lists.foreach/2
    (stdlib) erl_eval.erl:670: :erl_eval.do_apply/6

我好像在用categories。我做错了什么?

您的错误是由

引起的
categories = Api.Category |> all
|> put_resp_content_type("application/json")
|> send_resp(200, categories)

这是分配给类别的单个管道。因此,send_resp(200, categories) 中的类别未设置。

为了清楚起见,这是编写相同代码的另一种方式:

categories = 
  Api.Category 
  |> all
  |> put_resp_content_type("application/json")
  |> send_resp(200, categories)

此外,connstart_link放错了地方。 conn 什么也不做,start_link 通常 returns 一个丢失的 pid。

我相信你正在尝试这样的事情:

  categories = all Api.Category
  conn
  |> put_resp_content_type("application/json")
  |> send_resp(200, categories)

整个例子看起来很奇怪。我从来没有在 Repo 模块中看到过这种类型的东西。通常,您会在控制器中找到它。我无法对 route.ex 文件发表评论,因为我以前从未创建过这样的路由。

你在效仿这个例子吗?如果有,那是什么?