데이터베이스에서 가져오고 HTTP 응답에 결과를 반환하는 동안 오류가 발생했습니다.

벤자민 배긴스

내가 실행하는 경우 Api.Category |> Api.Repo.alliexI (기본적으로 나는 "카테고리"데이터베이스 테이블에서 두 행을 얻을) 터미널이 응답을 얻을 :

iex(1)> Api.Category |> Api.Repo.all

16:21:55.775 [debug] QUERY OK source="categories" db=5.2ms decode=6.3ms
SELECT c0."id", c0."name" FROM "categories" AS c0 []
[%Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 1,
  name: "Grocery Products"},
 %Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 2,
  name: "Meals"}]

해당 응답을 http 응답으로 다시 보내려고하지만이 오류가 발생합니다 (데이터베이스에서 아무것도 검색하지 않는 것 같습니다).

Poison.EncodeError at GET /categories unable to encode value: {nil, "categories"} lib/poison/encoder.ex
378  def encode(%{__struct__: _} = struct, options) do
379    Poison.Encoder.Map.encode(Map.from_struct(struct), options)
380  end
381
382  def encode(value, _options) do
383    raise Poison.EncodeError, value: value
384  end
385end

다음은 "categories"데이터베이스 테이블의 항목을 가져 와서 http 응답으로 반환하는 내 함수입니다.

  def getCategories(conn) do
    categories = Api.Category |> Api.Repo.all
    conn
    |> put_resp_content_type("application/json")
    |> send_resp(200, Poison.encode!(%{categories: categories}))
  end

내가 도대체 ​​뭘 잘못하고있는 겁니까?

연결을 설정했습니다.

application.ex :

defmodule Api.Application do
  use Application
  def start( _type, _args ) do
    import Supervisor.Spec, warn: false
    children = [
      worker(__MODULE__, [], function: :run),
      supervisor(Api.Repo, []),
    ]
    opts = [strategy: :one_for_one, name: Api.Supervisor]
    Supervisor.start_link(children, opts)
  end
  def run do
    { :ok, _ } = Plug.Adapters.Cowboy.http Api.Router, []
  end
end

repo.ex에는 내가 말한 모든 데이터베이스 쿼리 ( getCategories컨트롤러에 있어야하는 것을 포함하여 )가 이상하지만 반복 1, 먼저 작동하도록하고 싶습니다.

defmodule Api.Repo do
  use Ecto.Repo, otp_app: :api
  require Ecto.Query
  import Plug.Conn

  def insertCategories do 
    categories = [
      %Api.Category{name: "Grocery Products"},
      %Api.Category{name: "Meals"}
    ]
    Enum.each(categories, fn (category) -> insert(category) end)
  end

  def insertSubcategories do 
    subcategories = [
      %Api.Subcategory{name: "Meat"},
      %Api.Subcategory{name: "Dairy"},
      %Api.Subcategory{name: "Confectionary"},
      %Api.Subcategory{name: "Dessert"},
      %Api.Subcategory{name: "Baking"},
      %Api.Subcategory{name: "Condiments"},
      %Api.Subcategory{name: "Beverages"},
      %Api.Subcategory{name: "African"},
      %Api.Subcategory{name: "Argentine"},
      %Api.Subcategory{name: "Asian"},
      %Api.Subcategory{name: "Asian Fusion"},
      %Api.Subcategory{name: "BBQ"},
      %Api.Subcategory{name: "Bakery"},
      %Api.Subcategory{name: "Beverages"},
      %Api.Subcategory{name: "Brazilian"},
      %Api.Subcategory{name: "Breakfast"},
      %Api.Subcategory{name: "British"},
      %Api.Subcategory{name: "Cafe"},
      %Api.Subcategory{name: "Cambodian"},
      %Api.Subcategory{name: "Chinese"},
      %Api.Subcategory{name: "Coffee and Tea"},
      %Api.Subcategory{name: "Contemporary"},
      %Api.Subcategory{name: "Continental"},
      %Api.Subcategory{name: "Deli"},
      %Api.Subcategory{name: "Desserts"},
      %Api.Subcategory{name: "Drinks Only"},
      %Api.Subcategory{name: "European"},
      %Api.Subcategory{name: "Fijian"},
      %Api.Subcategory{name: "Filipino"},
      %Api.Subcategory{name: "Finger Food"},
      %Api.Subcategory{name: "Fish and Chips"},
      %Api.Subcategory{name: "French Fusion"},
      %Api.Subcategory{name: "German"},
      %Api.Subcategory{name: "Greek"},
      %Api.Subcategory{name: "Grill"},
      %Api.Subcategory{name: "Healthy Food"},
      %Api.Subcategory{name: "Ice Cream"},
      %Api.Subcategory{name: "Indian"},
      %Api.Subcategory{name: "Indonesian"},
      %Api.Subcategory{name: "International"},
      %Api.Subcategory{name: "Irish"},
      %Api.Subcategory{name: "Italian"},
      %Api.Subcategory{name: "Japanese"},
      %Api.Subcategory{name: "Jewish"},
      %Api.Subcategory{name: "Juices"},
      %Api.Subcategory{name: "Kiwi"},
      %Api.Subcategory{name: "Korean"},
      %Api.Subcategory{name: "Latin"},
      %Api.Subcategory{name: "American"},
      %Api.Subcategory{name: "Lebanese"},
      %Api.Subcategory{name: "Malaysian"},
      %Api.Subcategory{name: "Mediterranean"},
      %Api.Subcategory{name: "Mexican"},
      %Api.Subcategory{name: "Middle Eastern"},
      %Api.Subcategory{name: "Mongolian"},
      %Api.Subcategory{name: "Moroccan"},
      %Api.Subcategory{name: "Nepalese"},
      %Api.Subcategory{name: "North Indian"},
      %Api.Subcategory{name: "Pacific"},
      %Api.Subcategory{name: "Persian"},
      %Api.Subcategory{name: "Pizza"},
      %Api.Subcategory{name: "Portuguese"},
      %Api.Subcategory{name: "Pub Food"},
      %Api.Subcategory{name: "Seafood"},
      %Api.Subcategory{name: "Singaporean"},
      %Api.Subcategory{name: "South Indian"},
      %Api.Subcategory{name: "Spanish"},
      %Api.Subcategory{name: "Sri Lankan"},
      %Api.Subcategory{name: "Steakhouse"},
      %Api.Subcategory{name: "Street Food"},
      %Api.Subcategory{name: "Sushi"},
      %Api.Subcategory{name: "Taiwanese"},
      %Api.Subcategory{name: "Thai"},
      %Api.Subcategory{name: "Turkish"},
      %Api.Subcategory{name: "Vietnamese"},
    ]
    Enum.each(subcategories, fn (subcategory) -> insert(subcategory) end)
  end

  def insertCategorySubcategories do 
    categorySubcategories = [
      %Api.CategorySubcategory{c_id: 1, s_id: 1},
      %Api.CategorySubcategory{c_id: 1, s_id: 2},
      %Api.CategorySubcategory{c_id: 1, s_id: 3},
      %Api.CategorySubcategory{c_id: 1, s_id: 4},
      %Api.CategorySubcategory{c_id: 1, s_id: 5},
      %Api.CategorySubcategory{c_id: 1, s_id: 6},
      %Api.CategorySubcategory{c_id: 1, s_id: 7},
      %Api.CategorySubcategory{c_id: 2, s_id: 8},
      %Api.CategorySubcategory{c_id: 2, s_id: 9},
      %Api.CategorySubcategory{c_id: 2, s_id: 10},
      %Api.CategorySubcategory{c_id: 2, s_id: 11},
      %Api.CategorySubcategory{c_id: 2, s_id: 12},
      %Api.CategorySubcategory{c_id: 2, s_id: 13},
      %Api.CategorySubcategory{c_id: 2, s_id: 14},
      %Api.CategorySubcategory{c_id: 2, s_id: 15},
      %Api.CategorySubcategory{c_id: 2, s_id: 16},
      %Api.CategorySubcategory{c_id: 2, s_id: 17},
      %Api.CategorySubcategory{c_id: 2, s_id: 18},
      %Api.CategorySubcategory{c_id: 2, s_id: 19},
      %Api.CategorySubcategory{c_id: 2, s_id: 20},
      %Api.CategorySubcategory{c_id: 2, s_id: 21},
      %Api.CategorySubcategory{c_id: 2, s_id: 23},
      %Api.CategorySubcategory{c_id: 2, s_id: 24},
      %Api.CategorySubcategory{c_id: 2, s_id: 25},
      %Api.CategorySubcategory{c_id: 2, s_id: 26},
      %Api.CategorySubcategory{c_id: 2, s_id: 27},
      %Api.CategorySubcategory{c_id: 2, s_id: 28},
      %Api.CategorySubcategory{c_id: 2, s_id: 29},
      %Api.CategorySubcategory{c_id: 2, s_id: 30},
      %Api.CategorySubcategory{c_id: 2, s_id: 31},
      %Api.CategorySubcategory{c_id: 2, s_id: 32},
      %Api.CategorySubcategory{c_id: 2, s_id: 33},
      %Api.CategorySubcategory{c_id: 2, s_id: 34},
      %Api.CategorySubcategory{c_id: 2, s_id: 35},
      %Api.CategorySubcategory{c_id: 2, s_id: 36},
      %Api.CategorySubcategory{c_id: 2, s_id: 37},
      %Api.CategorySubcategory{c_id: 2, s_id: 38},
      %Api.CategorySubcategory{c_id: 2, s_id: 39},
      %Api.CategorySubcategory{c_id: 2, s_id: 40},
      %Api.CategorySubcategory{c_id: 2, s_id: 41},
      %Api.CategorySubcategory{c_id: 2, s_id: 42},
      %Api.CategorySubcategory{c_id: 2, s_id: 43},
      %Api.CategorySubcategory{c_id: 2, s_id: 44},
      %Api.CategorySubcategory{c_id: 2, s_id: 45},
      %Api.CategorySubcategory{c_id: 2, s_id: 46},
      %Api.CategorySubcategory{c_id: 2, s_id: 47},
      %Api.CategorySubcategory{c_id: 2, s_id: 49},
      %Api.CategorySubcategory{c_id: 2, s_id: 50},
      %Api.CategorySubcategory{c_id: 2, s_id: 51},
      %Api.CategorySubcategory{c_id: 2, s_id: 52},
      %Api.CategorySubcategory{c_id: 2, s_id: 53},
      %Api.CategorySubcategory{c_id: 2, s_id: 54},
      %Api.CategorySubcategory{c_id: 2, s_id: 55},
      %Api.CategorySubcategory{c_id: 2, s_id: 56},
      %Api.CategorySubcategory{c_id: 2, s_id: 57},
      %Api.CategorySubcategory{c_id: 2, s_id: 58},
      %Api.CategorySubcategory{c_id: 2, s_id: 59},
      %Api.CategorySubcategory{c_id: 2, s_id: 60},
      %Api.CategorySubcategory{c_id: 2, s_id: 61},
      %Api.CategorySubcategory{c_id: 2, s_id: 62},
      %Api.CategorySubcategory{c_id: 2, s_id: 63},
      %Api.CategorySubcategory{c_id: 2, s_id: 64},
      %Api.CategorySubcategory{c_id: 2, s_id: 65},
      %Api.CategorySubcategory{c_id: 2, s_id: 66},
      %Api.CategorySubcategory{c_id: 2, s_id: 67},
      %Api.CategorySubcategory{c_id: 2, s_id: 68},
      %Api.CategorySubcategory{c_id: 2, s_id: 69},
      %Api.CategorySubcategory{c_id: 2, s_id: 70},
      %Api.CategorySubcategory{c_id: 2, s_id: 71},
      %Api.CategorySubcategory{c_id: 2, s_id: 72},
      %Api.CategorySubcategory{c_id: 2, s_id: 73},
      %Api.CategorySubcategory{c_id: 2, s_id: 74},
    ]
    Enum.each(categorySubcategories, fn (categorySubcategory) -> insert(categorySubcategory) end)
  end

  def getCategories(conn) do
    insertCategories
    categories = all Api.Category
    conn
    |> put_resp_content_type("application/json")
    |> send_resp(200, Poison.encode!(%{categories: categories}))
  end

  def getSubcategories do
    Api.Subcategory |> all
  end
end

router.ex 관련 부분

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

나는 찾아보고 localhost:4000/categories상단에 오류를 얻습니다.

IO.puts (categories)의 출력-중복 된 행이 많지만 이는 또 다른 문제입니다.

16:59:54.922 [debug] QUERY OK source="categories" db=5.2ms decode=3.7ms
SELECT c0."id", c0."name" FROM "categories" AS c0 []
[%Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 1,
  name: "Grocery Products"},
 %Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 2,
  name: "Meals"},
 %Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 3,
  name: "Grocery Products"},
 %Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 4,
  name: "Meals"},
 %Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 5,
  name: "Grocery Products"},
 %Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 6,
  name: "Meals"},
 %Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 7,
  name: "Grocery Products"},
 %Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 8,
  name: "Meals"},
 %Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 9,
  name: "Grocery Products"},
 %Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 10,
  name: "Meals"},
 %Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 11,
  name: "Grocery Products"},
 %Api.Category{__meta__: #Ecto.Schema.Metadata<:loaded, "categories">, id: 12,
  name: "Meals"}]

16:59:55.038 [error] #PID<0.340.0> running Api.Router terminated
Server: localhost:4000 (http)
Request: GET /categories
** (exit) an exception was raised:
    ** (Poison.EncodeError) unable to encode value: {nil, "categories"}
        (poison) lib/poison/encoder.ex:383: Poison.Encoder.Any.encode/2
        (poison) lib/poison/encoder.ex:227: anonymous fn/4 in Poison.Encoder.Map.encode/3
        (poison) lib/poison/encoder.ex:228: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
        (poison) lib/poison/encoder.ex:228: Poison.Encoder.Map.encode/3
        (poison) lib/poison/encoder.ex:227: anonymous fn/4 in Poison.Encoder.Map.encode/3
        (poison) lib/poison/encoder.ex:228: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
        (poison) lib/poison/encoder.ex:228: Poison.Encoder.Map.encode/3
        (poison) lib/poison/encoder.ex:259: anonymous fn/3 in Poison.Encoder.List.encode/3
Dogbert

Poison.Encoder구조체의 __meta__필드 ( Poison처리하지 않는 튜플 포함) 를 인코딩하지 않도록 구조체 대한 사용자 지정 구현을 만들어야합니다 . 이를 수행하는 가장 쉬운 방법은 @derive인코딩하려는 필드의 이름을 사용하여 구조체에 를 추가하는 것입니다.

defmodule Api.Category do
  ...
  @derive {Poison.Encoder, only: [:id, :name]} # <- add this
  schema "categories" do
    ...
  end
  ...
end

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

sqllite에서 postgre django로 데이터베이스를 전환하는 동안 오류가 발생했습니다.

분류에서Dev

MySQL 데이터베이스에서 데이터를 선택하는 동안 오류가 발생했습니다.

분류에서Dev

C #의 데이터베이스에서 데이터를 읽는 동안 오류가 발생했습니다.

분류에서Dev

Joomla에서 PGSQL 데이터베이스에 연결하는 동안 오류가 발생했습니다.

분류에서Dev

데이터베이스에서 이미지를로드하는 동안 오류가 발생했습니다.

분류에서Dev

데이터베이스에서 DropDownListFor 채우기를 시도하는 동안 오류가 발생했습니다.

분류에서Dev

sqlite 데이터베이스에서 레코드를 삭제하는 동안 오류가 발생했습니다.

분류에서Dev

데이터베이스에 데이터를 삽입하는 동안 오류가 발생했습니다.

분류에서Dev

SQL Server 데이터베이스에 연결하는 동안 오류가 발생했습니다.

분류에서Dev

SQL 데이터베이스에 연결하는 동안 오류가 발생했습니다.

분류에서Dev

데이터베이스에 연결하는 동안 오류가 발생했습니다.

분류에서Dev

codeigniter에서 두 날짜 사이에 데이터를 가져 오는 동안 오류가 발생했습니다.

분류에서Dev

R에서 Google Analytics API에서 데이터를 가져 오는 동안 오류가 발생했습니다.

분류에서Dev

SQL 데이터베이스를 로컬에서 서버로 가져 오는 동안 오류가 발생했습니다.

분류에서Dev

Percona Xtradbcluster : 도너 노드에서 데이터를 가져 오는 동안 오류가 발생했습니다.

분류에서Dev

JSON 개체에서 데이터를 가져 오는 동안 오류가 발생했습니다.

분류에서Dev

데이터베이스에서 데이터를 가져 오는 동안 오류가 발생하고 인덱스 정의를 해제합니다.

분류에서Dev

phonegap 응용 프로그램에서 sqlite를 사용하여 내장 데이터베이스를 구현하는 동안 오류가 발생했습니다.

분류에서Dev

JSP를 사용하여 Tomcat 서버의 Oracle 데이터베이스에 연결하는 동안 오류가 발생했습니다.

분류에서Dev

스프링 부트 애플리케이션에서 로컬 MySQL 데이터베이스에 연결하는 동안 오류가 발생했습니다.

분류에서Dev

JavaFX에서 MYSQL 데이터베이스에 삽입하는 동안 오류가 발생했습니다.

분류에서Dev

JavaFX에서 MYSQL 데이터베이스에 삽입하는 동안 오류가 발생했습니다.

분류에서Dev

Java 코드에서 Python 파일을 호출하고 결과를 가져 오는 동안 오류가 발생했습니다.

분류에서Dev

데이터베이스에서 webdriver로 URL을 전달하는 동안 오류가 발생했습니다.

분류에서Dev

연결된 Docker 컨테이너에서 http 요청을 만드는 동안 오류가 발생했습니다.

분류에서Dev

뷰에서 데이터 형식 nvarchar를 bigint로 변환하는 동안 오류가 발생했습니다.

분류에서Dev

Windows Phone 8.1 애플리케이션에서 SQLite 데이터베이스에 연결하는 동안 오류가 발생했습니다.

분류에서Dev

UWP 애플리케이션에서 Postgres 데이터베이스에 연결하는 동안 오류가 발생했습니다.

분류에서Dev

nvarchar에서 숫자로 데이터를 캐스트하는 동안 오류가 발생했습니다.

Related 관련 기사

  1. 1

    sqllite에서 postgre django로 데이터베이스를 전환하는 동안 오류가 발생했습니다.

  2. 2

    MySQL 데이터베이스에서 데이터를 선택하는 동안 오류가 발생했습니다.

  3. 3

    C #의 데이터베이스에서 데이터를 읽는 동안 오류가 발생했습니다.

  4. 4

    Joomla에서 PGSQL 데이터베이스에 연결하는 동안 오류가 발생했습니다.

  5. 5

    데이터베이스에서 이미지를로드하는 동안 오류가 발생했습니다.

  6. 6

    데이터베이스에서 DropDownListFor 채우기를 시도하는 동안 오류가 발생했습니다.

  7. 7

    sqlite 데이터베이스에서 레코드를 삭제하는 동안 오류가 발생했습니다.

  8. 8

    데이터베이스에 데이터를 삽입하는 동안 오류가 발생했습니다.

  9. 9

    SQL Server 데이터베이스에 연결하는 동안 오류가 발생했습니다.

  10. 10

    SQL 데이터베이스에 연결하는 동안 오류가 발생했습니다.

  11. 11

    데이터베이스에 연결하는 동안 오류가 발생했습니다.

  12. 12

    codeigniter에서 두 날짜 사이에 데이터를 가져 오는 동안 오류가 발생했습니다.

  13. 13

    R에서 Google Analytics API에서 데이터를 가져 오는 동안 오류가 발생했습니다.

  14. 14

    SQL 데이터베이스를 로컬에서 서버로 가져 오는 동안 오류가 발생했습니다.

  15. 15

    Percona Xtradbcluster : 도너 노드에서 데이터를 가져 오는 동안 오류가 발생했습니다.

  16. 16

    JSON 개체에서 데이터를 가져 오는 동안 오류가 발생했습니다.

  17. 17

    데이터베이스에서 데이터를 가져 오는 동안 오류가 발생하고 인덱스 정의를 해제합니다.

  18. 18

    phonegap 응용 프로그램에서 sqlite를 사용하여 내장 데이터베이스를 구현하는 동안 오류가 발생했습니다.

  19. 19

    JSP를 사용하여 Tomcat 서버의 Oracle 데이터베이스에 연결하는 동안 오류가 발생했습니다.

  20. 20

    스프링 부트 애플리케이션에서 로컬 MySQL 데이터베이스에 연결하는 동안 오류가 발생했습니다.

  21. 21

    JavaFX에서 MYSQL 데이터베이스에 삽입하는 동안 오류가 발생했습니다.

  22. 22

    JavaFX에서 MYSQL 데이터베이스에 삽입하는 동안 오류가 발생했습니다.

  23. 23

    Java 코드에서 Python 파일을 호출하고 결과를 가져 오는 동안 오류가 발생했습니다.

  24. 24

    데이터베이스에서 webdriver로 URL을 전달하는 동안 오류가 발생했습니다.

  25. 25

    연결된 Docker 컨테이너에서 http 요청을 만드는 동안 오류가 발생했습니다.

  26. 26

    뷰에서 데이터 형식 nvarchar를 bigint로 변환하는 동안 오류가 발생했습니다.

  27. 27

    Windows Phone 8.1 애플리케이션에서 SQLite 데이터베이스에 연결하는 동안 오류가 발생했습니다.

  28. 28

    UWP 애플리케이션에서 Postgres 데이터베이스에 연결하는 동안 오류가 발생했습니다.

  29. 29

    nvarchar에서 숫자로 데이터를 캐스트하는 동안 오류가 발생했습니다.

뜨겁다태그

보관