You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Deno应用部署至fly.io时遇Bcrypt模块找不到错误求助

解决Deno部署fly.io时bcrypt找不到原生模块的问题

问题根源

  1. Deno默认不执行npm包的生命周期脚本(比如bcrypt的postinstall,负责编译原生二进制文件),除非配置nodeModulesDir: auto
  2. bcrypt是原生Node模块,需要在部署环境中安装编译依赖才能生成对应平台的.node文件

方案一:启用nodeModulesDir并添加编译依赖

1. 配置deno.json

在项目根目录创建或修改deno.json,添加以下配置:

{
  "nodeModulesDir": "auto"
}

2. 修改Dockerfile

添加编译依赖,并在构建阶段执行install触发脚本:

# Based on https://github.com/denoland/deno_docker/blob/main/alpine.dockerfile

ARG DENO_VERSION=2.0.6
ARG BIN_IMAGE=denoland/deno:bin-${DENO_VERSION}
FROM ${BIN_IMAGE} AS bin

FROM frolvlad/alpine-glibc:alpine-3.13

# 安装bcrypt编译所需的gcc、g++、make、python3
RUN apk --no-cache add ca-certificates gcc g++ make python3

RUN addgroup --gid 1000 deno \
  && adduser --uid 1000 --disabled-password deno --ingroup deno \
  && mkdir /deno-dir/ \
  && chown deno:deno /deno-dir/

ENV DENO_DIR /deno-dir/
ENV DENO_INSTALL_ROOT /usr/local

ARG DENO_VERSION
ENV DENO_VERSION=${DENO_VERSION}
COPY --from=bin /deno /bin/deno

WORKDIR /deno-dir
COPY . .

# 执行install命令触发npm包的postinstall脚本,编译bcrypt原生模块
RUN deno install --allow-all main.ts

ENTRYPOINT ["/bin/deno"]
CMD ["run", "--allow-all", "main.ts"]

方案二:改用纯JS实现的bcryptjs

如果不想处理编译依赖,推荐使用纯JavaScript实现的bcryptjs,无需编译原生模块:

  1. 将代码中的bcrypt导入替换为:
import bcrypt from "npm:bcryptjs";
  1. 移除Dockerfile中的编译依赖安装步骤,保持原有配置即可

验证部署

修改完成后,重新执行fly.io部署命令:

fly deploy

内容的提问来源于stack exchange,提问作者Jonny Love

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:01:14