@js在Rocket Chat提问:Docker化eWallet服务器登录接口触发FunctionClauseError
这个错误的根源其实很清晰——服务端某个需要URL-safe Base64解码的加密密钥参数是nil,导致Elixir的Base.url_decode64/2函数找不到匹配的处理子句(它只接受二进制字符串作为第一个参数,无法处理nil值)。下面是一步步的排查和解决方法:
检查加密密钥环境变量配置
eWallet依赖Salty库处理加密操作,必须通过环境变量设置有效的加密密钥(通常是EWALLET_ENCRYPTION_KEY)。如果Docker容器启动时这个变量未配置或者值为空,就会导致nil传入解码函数触发错误。
打开你的Docker运行命令或者docker-compose.yml文件,确认是否配置了该环境变量,且值不为空。生成符合要求的加密密钥
如果还没有合适的密钥,可以用以下命令生成标准的URL-safe Base64密钥:openssl rand -hex 32 | base64 | tr '+/' '-_' | tr -d '='把生成的字符串复制出来,作为
EWALLET_ENCRYPTION_KEY的值配置到Docker环境中。重启容器使配置生效
修改环境变量后,一定要重启Docker容器,确保新的配置被加载。可以用docker restart <container-name>或者docker-compose restart命令完成重启。快速验证请求参数
虽然这个错误大概率是服务端配置问题,但也可以快速确认下登录请求是否正确传递了email和password等必填字段,避免因请求格式错误间接触发异常。
附上你提供的错误详情供参考:
Request: POST /admin/api/login ** (exit) 触发异常: ** (FunctionClauseError) no function clause matching in Base.url_decode64/2 (elixir) lib/base.ex:482: Base.url_decode64(nil, [padding: false]) (salty) lib/salty/utils.ex:18: Salty.Utils.decode_key/2 (salty) lib/salty/secret_box.ex:53: Salty.SecretBox.d...
内容的提问来源于stack exchange,提问作者Unnawut

