通过Serverless Framework部署AWS Lambda时调整Prisma schema路径
解决Serverless Framework + Prisma 部署后schema.prisma路径错误问题
问题场景
使用Serverless Framework的aws-node-typescript模板项目集成Prisma时,部署后实例化PrismaClient触发内部服务器错误,日志提示:
ENOENT: no such file or directory, open '/var/task/src/functions/users/schema.prisma'
已配置package: { individually: true, patterns: ["**/*.prisma"] },但打包后的users.zip中,schema.prisma位于users/prisma/目录,而非PrismaClient期望的/var/task/src/functions/users/路径。
解决方案
方案一:实例化PrismaClient时指定schema绝对路径(推荐)
无需调整打包结构,直接在handler中指定部署后schema.prisma的实际路径,保持项目结构整洁:
import { formatJSONResponse } from '@libs/api-gateway'; import { middyfy } from '@libs/lambda'; import { PrismaClient } from '@prisma/client' const users = async (event) => { console.log(`Instantiating PrismaClient inside handler ...`) // 指定schema的绝对路径 const prisma = new PrismaClient({ schema: '/var/task/prisma/schema.prisma', datasources: { db: { url: process.env.DATABASE_URL, }, }, }) return formatJSONResponse({ message: `Hello, ${event.queryStringParameters.name || 'there'} welcome to the exciting Serverless world!`, event, }); }; export const main = middyfy(users);
方案二:调整Serverless打包规则,复制schema到目标目录
如果需要将schema.prisma直接放到函数目录下,可通过Serverless的打包路径映射规则实现。在serverless.ts的users函数配置中单独设置打包规则:
// serverless.ts 中functions配置片段 functions: { // ... 其他函数配置 users: { handler: 'src/functions/users/main.handler', events: [ { httpApi: { path: '/users', method: 'get', }, }, ], package: { patterns: [ // 复制根目录的schema.prisma到函数目录 { from: '../../prisma/schema.prisma', // 相对于users函数目录的路径 to: './schema.prisma' // 打包后放置的目标路径 } ] } } }
注意事项
- 确保
DATABASE_URL环境变量在Serverless配置中正确配置,且Railway的PostgreSQL数据库安全组允许AWS函数的IP访问 - 执行
sls package后可解压对应zip包,验证schema.prisma的路径是否符合预期,再进行部署
内容的提问来源于stack exchange,提问作者nburk
相关产品推荐
相关产品推荐

