Elixir httpserver : priv_dir returns something in _build directory, thus I can't send static files that are in source directory

huangapple go评论56阅读模式
英文:

Elixir httpserver : priv_dir returns something in _build directory, thus I can't send static files that are in source directory

问题

以下是您要翻译的内容:

"I'm starting Elixir and I'm currently working on a basic web server / API. I'm only using plug_cowboy for now, since I'm focusing on learning the basics.

The server is using plug :match and plug :dispatch to answer to various GET requests. In one of those answers, I'm trying to send HTML files using the send_file function.

My problem being that the server cannot find the files because it doesn't exist where the app searches that file.

HTML file location: lib/httpserver/priv/index.html
Searched path: _build/dev/lib/httpserver/priv/index.html

There is the code in the Router:

defmodule Httpserver.Router do
  use Plug.Router

  forward("/static", to: Httpserver.Static)

  plug :match
  plug :dispatch

  get "/" do
    priv_dir = :code.priv_dir(:httpserver)
    index_path = Path.join([priv_dir, "index.html"])
    send_file(conn, 200, index_path)
  end

  get "/:name" do
    send_resp(conn, 200, "Welcome, #{name} !")
  end

  match _ do
    send_resp(conn, 404, "Not found...")
  end
end

I have tried:

  • looking at ERLang's documentation
  • looking at various elixir forum posts
  • looking at some older stack overflow posts

All I could find was about the start_permanent and build_embedded options in mix.exs's project function, and did not solve my problem."

英文:

I'm starting Elixir and I'm currently working on a basic web server / API.
I'm only using plug_cowboy for now, since I'm focusing on learning the basics.

The server is using plug :match and plug :dispatch to answer to various GET requests.
In one of those answers, I'm trying to send HTML files using the send_file function.

My problem being that the server cannot find the files because it doesn't exists where the app searches that file.

HTML file location: lib/httpserver/priv/index.html
Searched path: _build/dev/lib/httpserver/priv/index.html

There is the code in the Router:

defmodule Httpserver.Router do
  use Plug.Router

  forward("/static", to: Httpserver.Static)

  plug :match
  plug :dispatch

  get "/" do
    priv_dir = :code.priv_dir(:httpserver)
    index_path = Path.join([priv_dir, "index.html"])
    send_file(conn, 200, index_path)
  end

  get "/:name" do
    send_resp(conn, 200, "Welcome, #{name} !")
  end

  match _ do
    send_resp(conn, 404, "Not found...")
  end
end

I have tried:

  • looking at ERLang's documentation
  • looking at various elixir forum posts
  • looking at some older stack overflow posts

All I could find was about the start_permanent and build_embedded options in mix.exs's project function, and did not solver my problem.

答案1

得分: 0

:code.priv_dir/1 是一个辅助函数,它对你的实际代码一无所知,只是获取应用程序 运行 的路径,并将其与 "priv" 连接起来。毕竟,在生产环境中,没有源代码文件夹。

你应该手动复制该文件夹或者使用 File.cwd/0 代替。

英文:

:code.priv_dir/1 is a helper which knows nothing about your actual code, it just grabs the path where the application runs and concatenates it with "priv". After all, in production one does not even have a source folder.

You should either copy the folder manually or use File.cwd/0 instead.

huangapple
  • 本文由 发表于 2023年3月1日 12:26:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/75599573.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定