Ajax POST 请求未命中 Elixir 路由器路径

Ajax POST request not hitting Elixir router path

我有这个 redux-observable 史诗,它使用 RxJS.ajax.post 执行 POST ajax 请求,但我认为它没有正确访问我的 Elixir 路由器,因为什么都没有发生在我的长生不老药后端。我正在以相同的方式获取正确获取类别的请求,因此我正确地访问了我的 Elixir 路由器中的其他路径。我希望问题出在我的后端 Elixir 代码上,而不是我的前端。我可能需要更改 router.ex.

中的路径

当我在前端按下一个按钮时,这个 object 就是被发送到 elixir 后端的东西(它用一个产品作为有效负载来发送这个动作并点击下面的 redux-observable 史诗) :

onPress = {() => {
  props.uploadProduct({
    name: props.name,
    brand: props.brand,
    description: props.description,
    image: props.image
  })

史诗:

import { ajax } from 'rxjs/observable/dom/ajax'
import { Observable } from 'rxjs'

export const uploadProductEpic = action$ =>
  action$.ofType(UPLOAD_PRODUCT)
    .mergeMap(action => {
      ajax.post('http://localhost:4000/products/', action.payload)
    })
    .map(response => uploadProductFulfilled(response))
    .catch(error => Observable.of(
      uploadProductRejected(error))
    )

长生不老药路由器:

defmodule Api.Router do
  use Plug.Router

  if Mix.env == :dev do
    use Plug.Debugger
  end
  plug :match
  plug :dispatch

  get "/categories/" do
    Api.Repo.getCategories(conn)
  end

  post "/products/:product" do
    IO.puts inspect conn
    Api.Repo.insertProduct(conn, product)
  end
end

IO.puts inspect conn 不记录任何内容。所以我的 Elixir 路由器路径 post "/products/:product" do 没有被我的 POST 请求命中。我做错了什么?

这是 repo.ex 中的长生不老药功能,我希望将产品插入我的数据库:

  def insertProduct(conn, product) do
    product = %Api.Product{name: product.name, brand: product.brand, description: product.description, image: product.image, rating: 0, numberOfVotes: 0}
    changeset = Api.Product.changeset(product)
    errors = changeset.errors
    valid = changeset.valid?
    case insert(changeset) do
      {:ok, product} ->
        conn
          |> put_resp_content_type("application/json")
          |> send_resp(200, Poison.encode!(%{
              successs: "success"
          }))
      {:error, changeset} ->
        conn
          |> put_resp_content_type("application/json")
          |> send_resp(500, Poison.encode!(%{
              failure: "Errors"
          }))
    end
  end

我是一名前端开发人员,正试图进入 Elixir,因此感谢任何指导和耐心。谢谢。

您的数据是在请求正文中发送的,而不是在 URL 中发送的,所以路由应该是:

post "/products"

您还需要在 plug :match 之后和 plug :dispatch 之前插入 JSON 解析器,如 Plug.Router 文档中的参数解析部分所述:

plug :match
plug Plug.Parsers, parsers: [:json],
                   pass:  ["application/json"],
                   json_decoder: Poison
plug :dispatch

JSON 数据现在将出现在 conn.body_params 中,您可以将其发送到您的函数:

post "/products" do
  Api.Repo.insertProduct(conn, conn.body_params)
end

最后,JSON 中的键是字符串,因此您需要使用括号语法而不是点来访问它们:

product = %Api.Product{name: product["name"], brand: product["brand"], description: product["description"], image: product["image"], rating: 0, numberOfVotes: 0}

我不确定您是如何定义 Api.Product.changeset,但默认的 Phoenix 约定定义了一个 2 arity 函数,该函数调用 cast 并从地图本身提取数据。如果你也这样做,你可以这样做:

changeset = Api.Product.changeset(%Api.Product{}, product)