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

Next.js集成Prisma Client部署AWS Serverless无法运行问题

Next.js 搭配Prisma部署AWS Serverless异常修复方案

问题基础信息

  • 技术栈版本:Next.js 12.1.6、Prisma ^3.15.2
  • 异常表现:项目部署至Vercel可全功能正常运行,通过Serverless框架部署到AWS时服务不可用;移除Prisma Client依赖后,AWS环境下应用可恢复正常运行。

初始配置情况

初始serverless.yml配置如下:

myNextApp:
  component: "@sls-next/serverless-component"

next.config.js中已预先配置正确的数据库连接参数:

DATABASE_URL:"mysql://***:***@***:3306/****"

已尝试操作与遇到的阻塞

曾尝试通过构建后命令复制Prisma引擎文件到Lambda产物目录的方案,修改serverless.yml配置如下:

yourProjectName:
  component: "@sls-next/serverless-component@1.19.0"
  inputs:
    minifyHandlers: true
    build:
      postBuildCommands:
        - PDIR=node_modules/.prisma/client/;
          LDIR=.serverless_nextjs/api-lambda/;
          if [ "$(ls -A $LDIR)" ]; then
            mkdir -p $LDIR$PDIR;
            cp "$PDIR"query-engine-rhel-* $LDIR$PDIR;
            cp "$PDIR"schema.prisma $LDIR$PDIR;
          fi;
        - PDIR=node_modules/.prisma/client/;
          LDIR=.serverless_nextjs/default-lambda/;
            if [ "$(ls -A $LDIR)" ]; then
              mkdir -p $LDIR$PDIR;
              cp "$PDIR"query-engine-rhel-* $LDIR$PDIR;
              cp "$PDIR"schema.prisma $LDIR$PDIR;
          fi;

操作过程中遇到两个阻塞问题:

  • 在Windows 10系统执行serverless部署命令时,终端报错:PDIR is not recognized as an internal or external command, operable program or batch file.
  • 尝试手动将.prisma/client文件夹复制到.serverless_nextjs/api-lambda/和.serverless_nextjs/default-lambda/目录下,执行serverless命令后该文件夹会被自动清理,配置无法生效。

根因分析

  1. 部署命令报错是因为配置的postBuildCommands是Bash语法,Windows原生CMD、PowerShell不支持该语法的变量定义、流程判断逻辑,无法识别PDIR等自定义变量。
  2. 手动复制文件被删除是因为serverless-nextjs组件在打包阶段会先清空产物目录再执行构建流程,手动复制的操作时机早于目录清空步骤,文件会被直接覆盖删除。
  3. 旧版本组件(1.19.0)对Next.js 12的兼容性不足,且未指定Prisma对应Lambda运行环境的二进制目标,会导致引擎文件缺失、路径识别错误。

修复步骤

按顺序执行以下操作即可解决问题:

  1. 切换部署执行环境
    不要在Windows原生CMD/PowerShell中执行部署命令,改用WSL(Windows子系统Linux)执行所有部署相关命令,WSL原生支持Bash语法,可正常执行shell格式的构建后命令。
  2. 配置Prisma Lambda适配的二进制目标
    打开项目根目录下的schema.prisma文件,在generator块中添加AWS Lambda(Amazon Linux 2环境)对应的二进制目标配置:
    generator client {
      provider      = "prisma-client-js"
      binaryTargets = ["native", "rhel-openssl-1.0.x"]
    }
    
    修改完成后执行npx prisma generate,重新生成适配Lambda环境的Prisma Client和对应引擎文件。
  3. 升级并修正serverless.yml配置
    首先将@sls-next/serverless-component升级到适配Next.js 12的稳定版本,关闭会混淆Prisma路径查找的minifyHandlers选项,修正构建后命令格式,补充Lambda环境变量、内存和超时配置,最终配置参考如下:
    myNextApp:
      component: "@sls-next/serverless-component@3.7.0"
      inputs:
        minifyHandlers: false
        build:
          postBuildCommands:
            - "PDIR=node_modules/.prisma/client/; LDIR=.serverless_nextjs/api-lambda/; if [ -d \"$LDIR\" ]; then mkdir -p $LDIR$PDIR; cp -r $PDIR* $LDIR$PDIR; fi;"
            - "PDIR=node_modules/.prisma/client/; LDIR=.serverless_nextjs/default-lambda/; if [ -d \"$LDIR\" ]; then mkdir -p $LDIR$PDIR; cp -r $PDIR* $LDIR$PDIR; fi;"
        env:
          DATABASE_URL: "mysql://***:***@***:3306/****"
        api:
          memorySize: 1024
          timeout: 10
        defaultLambda:
          memorySize: 1024
          timeout: 10
    
  4. 清理缓存后重新部署
    执行部署前先删除项目根目录下的.serverless_nextjs缓存文件夹,避免旧的构建缓存影响打包结果,之后在WSL环境下执行部署命令即可。

注意:如果部署后仍出现Prisma引擎加载错误,可检查打包产物中.prisma/client目录下是否包含rhel开头的query-engine文件,若缺失可手动在postBuildCommands中补充对应文件的复制逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:01:19