elixir - 模块 Bcrypt.Base 不可用

标签 elixir phoenix-framework

我一直在尝试 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/

相关文章:

elixir - 带有多个 'or' 子句的 Ecto Repo.get_by

uri - Elixir 中的encodeURIComponent

elixir - Phoenix Framework (Elixir) - 将 JS 文件加载到 Assets 管道中

Docker 容器在约 1 分钟后被终止

elixir - 如何将日期和时间字符串解析为与 Elixir 的 Ecto.DateTime 兼容的类型?

elixir - 如何设置 Ecto 变更集以防止保存缺少必填字段的模型?

elixir - 如何通过Phoenix应用程序的自定义erl选项?

elixir - HTTPoison.request!/5 以奇怪的原因引发 %HTTPoison.Error

elixir - 您如何为 ueberauth 身份进行单独的注册回调

docker - 如何使用Phoenix Guides中的示例在生产模式下运行Elixir Phoenix Docker?