[英]Error in using cowboy in Elixir
我在Elixir中使用了Erlang Web框架:cowboy
,在:cowboy_http_req.reply
出現錯誤,這是我的代碼:
mix.exs是:
defmodule Example.Mixfile do
use Mix.Project
def project do
[ app: :example,
version: "0.0.1",
deps: deps ]
end
# Configuration for the OTP application
def application do
[
# you should start :inets and :crypto first, or it will not start cowboy
applications: [:inets, :crypto],
mod: {Example, []}
]
end
# Returns the list of dependencies in the format:
# { :foobar, "0.1", git: "https://github.com/elixir-lang/foobar.git" }
defp deps do
[
{ :cowboy, github: "extend/cowboy", tag: "0.9.0" },
# { :lager, github: "basho/lager" }
]
end
end
lib / example.ex是
defmodule示例確實使用Application.Behaviour
def start(_type, _args) do
deps_started
dispatch = :cowboy_router.compile([
{:_, [
{"/objects/[...]", Example.Object, []}
]}
])
:cowboy.start_http(:http, 100, [ip: {127,0,0,1}, port: 9080], [env: [dispatch: dispatch]])
ExampleSup.start_link
end
defp deps_started do
deps = [:ranch, :cowlib, :cowboy]
Enum.all? deps, &ensure_started/1
end
defp ensure_started(app) do
case :application.start(app) do
:ok ->
true
{:error, {:already_started, _app}} ->
true
{:error, {:not_started, dep}} ->
true = ensure_started(dep)
ensure_started(app)
error ->
IO.puts "Couldn't start #{inspect app}: #{inspect error}"
error
end
end
end
我的lib / example / object.ex是:
defmodule Example.Object do
@behaviour :cowboy_http_handler
def init(_type, req, _opts) do
{:ok, req, :undefine}
end
def handle(req, state) do
{ok, req} = :cowboy_http_req.reply(200, [], "hello world", req)
{:ok, req, state}
end
def terminate(_reason, _request, _state), do: :ok
end
我使用mix管理銷售代表,並使用idx -S mix
啟動牛仔服務器,然后使用curl發送一個HTTP流:
curl -i http://127.0.0.1:9080/objects/index.html
服務器收到錯誤報告錯誤:
=ERROR REPORT==== 28-Feb-2014::18:03:36 ===
Error in process <0.201.0> with exit value: {[{reason,undef},{mfa {'Elixir.Example.Object',handle,2}},{stacktrace,[{cowboy_http_req,reply,[200,[],<<11 bytes>>,{http_req,#Port<0.4438>,ranch_tcp,keepalive,<0.201.0>,<<3 bytes>>,'HTTP/1.1',{{127,0,0,1},58008},<<9 bytes>>,undefined,9080,<<14 bytes>>,[<<5 bytes>>],<<0 bytes>>,undefined,[],[{<<10 bytes>>,<<11 bytes>>},{<<4 bytes>>,<<14 bytes>>},{<<6 bytes>>,<<3 bytes>>}],[],undefined,[],waiting,undefined...
並且curl客戶端收到500 Internal Server Error
。
有人可以幫我指出問題嗎? 非常感謝。
錯誤消息分為三個部分:
undef
{'Elixir.Example.Object',handle,2}
[{cowboy_http_req,reply,[200,[],<<11 bytes>>,...]}, ...]
糟糕的是,您在Example.Object
模塊的handle/2
中遇到了undef
錯誤(這意味着未定義的函數)。 該錯誤具有調用cowboy_http_req.reply/4
。 我的直覺是cowboy_http_req
不存在,您應該調用cowboy_req
。
我也建議您使用Plug ,盡管我們目前尚沒有可很好地顯示錯誤的工具,但它即將推出。 我們還將很快與Elixir一起交付記錄器,這將有助於處理一些消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.