无法通过AWS Lambda函数提供PDF文件的问题排查
AWS Lambda + Express 404错误排查与解决
问题背景
将包含index.js与document.pdf(同根目录)的压缩包上传至AWS Lambda控制台,使用Express和serverless-http编写代码,配置HTTP API端点后访问URL出现404错误,已尝试调整多种配置仍未解决。
现有代码
const express = require("express"); const serverless = require("serverless-http"); const path = require("path"); const app = express(); app.all("/", (req, res, next) => { res.set('Content-Type', 'application/pdf'); res.sendFile(path.join(__dirname, "./document.pdf")); }); module.exports.handler = serverless(app);
相关配置说明
- API配置:HTTP API已集成目标Lambda函数,路由配置为默认的
/$default(或自定义路径) - 文件系统:Lambda代码包根目录下存在
index.js和document.pdf两个文件
可能的问题点及解决方法
1. API Gateway路由与Express路由不匹配
AWS HTTP API默认集成路径可能带阶段名(如/dev)或使用/{proxy+}通配,而你的Express仅监听根路径/,导致请求实际路径不匹配。
- 解决方法:
- 调整Express路由匹配实际请求路径:若API端点为
https://xxx.execute-api.region.amazonaws.com/dev,则修改路由为/dev
app.all("/dev", (req, res, next) => { res.set('Content-Type', 'application/pdf'); res.sendFile(path.join(__dirname, "./document.pdf")); });- 配置
serverless-http自动剥离前缀:
module.exports.handler = serverless(app, { basePath: '/dev' });- 在API Gateway中修改路由,将根路径
/直接集成到Lambda,移除阶段前缀或设置阶段为根路径。
- 调整Express路由匹配实际请求路径:若API端点为
2. Lambda环境路径拼接问题
Lambda中__dirname的路径指向可能和本地环境不同,导致文件查找失败。可尝试替换路径写法:
// 简化路径拼接 res.sendFile(`${__dirname}/document.pdf`); // 或使用process.cwd()获取代码根目录 res.sendFile(path.join(process.cwd(), "document.pdf"));
3. 未处理通配路径
若API Gateway路由为/{proxy+},Express需处理所有子路径,调整路由为通配符:
app.all("/*", (req, res, next) => { res.set('Content-Type', 'application/pdf'); res.sendFile(path.join(__dirname, "./document.pdf")); });
4. 查看Lambda日志定位具体错误
登录AWS CloudWatch,找到对应Lambda的日志组:
- 若日志显示
Error: ENOENT: no such file or directory,说明文件路径错误,需调整路径写法 - 若显示路由不匹配,说明请求路径未被Express处理,需调整路由配置
5. 确认API Gateway集成配置正确
检查API Gateway集成是否关联到目标Lambda,Payload format version需设置为2.0(serverless-http支持该格式),同时确保无错误的路径重写或请求参数配置。
内容的提问来源于stack exchange,提问作者Aniket Saurav
相关产品推荐
相关产品推荐

