我一直在尝试 Elixir,尽管尝试了很多次,但仍无法解决这个问题。
我已经安装并编译了 Bycrypt 模块,但出现“模块 Bcrypt.Base 不可用”错误。
这是我对 user.ex 文件的加密方法:
defp encrypt_password(changeset) do
if changeset.valid? do
changeset
|> put_change(:password_hash, Bcrypt.hash_pwd_salt(changeset.changes.password))
else
changeset
end
end
这是错误:
Server: localhost:4000 (http)
Request: POST //api/v1/users
** (exit) an exception was raised:
** (UndefinedFunctionError) function Bcrypt.Base.gensalt_nif/3 is undefined (module Bcrypt.Base is not available)
(bcrypt_elixir) Bcrypt.Base.gensalt_nif(<<173, 70, 166, 223, 71, 67, 148, 239, 134, 39, 160, 5, 39, 96, 163, 253>>, 12, 98)
(bcrypt_elixir) lib/bcrypt.ex:86: Bcrypt.hash_pwd_salt/2
(portal_api) web/models/user.ex:285: PortalApi.User.encrypt_password/1
(portal_api) web/controllers/user_controller.ex:204: PortalApi.UserController.create_user/3
(portal_api) web/controllers/user_controller.ex:1: PortalApi.UserController.action/2
(portal_api) web/controllers/user_controller.ex:1: PortalApi.UserController.phoenix_controller_pipeline/2
(phoenix) lib/phoenix/router.ex:288: Phoenix.Router.__call__/2
(portal_api) lib/plug/error_handler.ex:64: PortalApi.Router.call/2
(portal_api) lib/portal_api/endpoint.ex:1: PortalApi.Endpoint.plug_builder_call/2
(portal_api) lib/plug/debugger.ex:122: PortalApi.Endpoint."call (overridable 3)"/2
(portal_api) lib/portal_api/endpoint.ex:1: PortalApi.Endpoint.call/2
(plug_cowboy) lib/plug/cowboy/handler.ex:18: Plug.Adapters.Cowboy.Handler.upgrade/4
(cowboy) c:/laragon/www/wirecrafters/portal-api/deps/cowboy/src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4
这是我在 mix.exs 文件中的 deps:
defp deps do
[
{:phoenix, "~> 1.3"},
{:phoenix_pubsub, "~> 1.0"},
{:phoenix_ecto, "~> 3.2.2"},
{:postgrex, ">= 0.0.0"},
{:phoenix_html, "~> 2.13"},
{:phoenix_live_reload, "~> 1.2.1", only: :dev},
{:gettext, "0.13.1"},
{:junit_formatter, ">= 2.0.0"},
{:comeonin, "~> 5.3"},
{:remix, "~> 0.0.1", only: :dev},
{:ex_machina, "~> 1.0"},
{:ja_serializer, ">= 0.12.0"},
{:guardian, "~> 1.2"},
{:faker, "~> 0.7"},
{:cowboy, "~> 1.1"},
{:plug_cowboy, "~> 1.0"},
{:corsica, "~> 0.5"},
{:timex, "~> 3.0"},
{:timex_ecto, "~> 3.0"},
{:canary, "~>1.1.0"},
{:credo, "~> 0.8", only: [:dev, :test]},
{:bamboo, "~> 1.2.0"},
{:bamboo_smtp, "~> 1.7.0"},
{:arc, "~> 0.11"},
{:arc_ecto, "~> 0.11"},
{:ex_aws, "~> 2.1"},
{:ex_aws_s3, "~> 2.0"},
{:hackney, "~> 1.15"},
{:poison, "~> 2.1"},
{:sweet_xml, "~> 0.6"},
{:secure_random, "~> 0.5"},
{:floki, "~> 0.17.0"},
{:bugsnex, "~> 0.4.1"},
{:temp, "~> 0.4"},
{:csv, "~> 2.1.1"},
{:scrivener_ecto, "~> 1.0"},
{:quantum, ">= 2.2.7"},
{:elixir_uuid, "~> 1.2"},
{:jason, "~> 1.1"},
{:bcrypt_elixir, "~> 1.0"}
]
end
我有什么遗漏的吗?有什么想法可以让它发挥作用吗? 谢谢,
最佳答案
如果我在混合项目中使用您的 deps
,我无法重现您的问题。如果我使用 Mix.install
加载依赖项并进行相同的调用:
iex(1)> Mix.install([{:bcrypt_elixir, "~> 1.0"}])
Resolving Hex dependencies...
Dependency resolution completed:
New:
bcrypt_elixir 1.1.1
elixir_make 0.6.2
* Getting bcrypt_elixir (Hex package)
* Getting elixir_make (Hex package)
...
Generated bcrypt_elixir app
:ok
iex(2)> Bcrypt.hash_pwd_salt("test")
"$2b$12$xzg3mp9AJQvz9mDZxoHDNerHUXXH1MX6BI6q.VE0uf6Ake/MM7v62"
您如何启动您的应用程序?看来您很可能没有完成 mix deps.get
,或者以某种方式没有正确获取或部署依赖项。
关于elixir - 模块 Bcrypt.Base 不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68855832/