Phoenix应用中能否编写Erlang模块及Erlang路由处理器?
结论
你无法直接在新增路由后,将独立保存的.erl文件作为路由对应的处理器直接挂载使用。
Phoenix的路由分发、控制器调用链路是基于Elixir模块的约定设计的,独立的裸Erlang文件不满足Phoenix控制器的接口规范,路由层无法直接识别、调用这类文件里的处理逻辑。
Erlang处理器接入Phoenix的可行方案
方案1:纳入项目编译体系,通过Elixir薄封装控制器调用
Elixir与Erlang生态完全互通,只要Erlang源码被Mix纳入编译流程,就可以在Elixir代码中直接调用:
- 将编写好的
.erl处理器文件放到项目根目录的src/文件夹下,Mix默认会自动编译该目录下的所有Erlang源码,编译生成的模块可直接在项目全局调用 - 按照Phoenix常规开发流程新增路由、创建对应的Elixir控制器,控制器的action只需要做极薄的转发层,直接调用Erlang模块的处理函数即可,示例如下:
% src/erlang_biz_handler.erl 自定义Erlang处理器 -module(erlang_biz_handler). -export([process/2]). process(Conn, Params) -> % 编写原生Erlang处理逻辑 Res = do_biz_calc(Params), {200, #{<<"content-type">> => <<"text/plain">>}, Res}.
# lib/your_app_web/controllers/erlang_entry_controller.ex defmodule YourAppWeb.ErlangEntryController do use YourAppWeb, :controller def erlang_action(conn, params) do {status, headers, body} = :erlang_biz_handler.process(conn, params) conn |> merge_resp_headers(headers) |> send_resp(status, body) end end
- 最后在
router.ex中按常规写法将目标路由绑定到上述控制器的对应action即可正常生效。
方案2:用Erlang实现Plug规范,直接挂载到路由
Phoenix的整个请求处理链路基于Plug规范构建,你也可以直接用Erlang编写符合Plug行为要求的处理模块:
- 在Erlang模块中实现
init/1、call/2两个Plug核心接口,将文件放到src/目录下完成编译 - 不需要编写完整的Elixir控制器,直接在路由文件中通过
forward/2或者路由管线挂载的方式,将指定路径的请求直接转发给你编写的Erlang Plug处理即可。
注意:该方案需要你自行处理参数解析、响应格式组装等逻辑,适合逻辑独立、不需要复用Phoenix现有控制器生态能力的场景。
方案3:独立部署Erlang服务做内网转发
如果你的Erlang处理器已经是独立运行的服务,不想整合进现有Phoenix项目的编译流程,也可以在Phoenix侧加一层薄转发逻辑:将指定路径的请求通过内网HTTP或者Erlang RPC调用转发给独立运行的Erlang服务,拿到处理结果后再返回给客户端即可。
内容的提问来源于stack exchange,提问作者ahron
相关产品推荐
相关产品推荐

